@magic-xpa/gui 4.801.0-dev481.302 → 4.801.0-dev481.306
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.
|
@@ -524,6 +524,7 @@ export class MgControlBase extends GuiControlPropertyAdapter {
|
|
|
524
524
|
let vd;
|
|
525
525
|
vd = this.buildCopyPicture(this.Value, newVal);
|
|
526
526
|
vd.evaluate();
|
|
527
|
+
this.ModifiedByUser = true;
|
|
527
528
|
let val = vd.getDispValue();
|
|
528
529
|
return (val.toString());
|
|
529
530
|
}
|
|
@@ -1870,4 +1871,4 @@ export class MgControlBase extends GuiControlPropertyAdapter {
|
|
|
1870
1871
|
}
|
|
1871
1872
|
}
|
|
1872
1873
|
}
|
|
1873
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDbEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQVcsV0FBVyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQU1oRCxNQUFNLE9BQWdCLGFBQWMsU0FBUSx5QkFBeUI7SUE2RW5FLFlBQVksSUFBb0IsRUFBRSxZQUF5QixFQUFFLGFBQXNCO1FBQ2pGLEtBQUssRUFBRSxDQUFDO1FBekVWLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDWixvQkFBZSxHQUF3QixJQUFJLENBQUM7UUFDcEQsV0FBTSxHQUFpQixJQUFJLENBQUM7UUFDcEIsWUFBTyxHQUFXLElBQUksQ0FBQztRQUMvQixpQkFBWSxHQUFtQixJQUFJLENBQUM7UUFDcEMscUJBQWdCLEdBQW1CLElBQUksQ0FBQztRQUN4QyxpQkFBWSxHQUFtQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBcUIsSUFBSSxDQUFDO1FBQzdCLHFCQUFnQixHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQ25DLGlCQUFZLEdBQWlCLElBQUksQ0FBQztRQUMxQiw0QkFBdUIsR0FBWSxJQUFJLENBQUM7UUFDeEMsVUFBSyxHQUFlLElBQUksQ0FBQztRQUN6QiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsUUFBRyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFekIsd0JBQW1CLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDekMsb0JBQWUsR0FBbUIsSUFBSSxDQUFDO1FBQ3ZDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxTQUFJLEdBQVEsSUFBSSxDQUFDO1FBQ1Qsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDdkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQzNCLHNCQUFpQixHQUFXLElBQUksQ0FBQztRQUN6QyxnQkFBVyxHQUFpQixJQUFJLENBQUM7UUFDakMsYUFBUSxHQUFjLElBQUksQ0FBQztRQUNuQixXQUFNLEdBQVcsSUFBSSxDQUFDO1FBQ3RCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLFlBQU8sR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3hDLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFDZCxRQUFHLEdBQXNCLElBQUksQ0FBQztRQUM5QixhQUFRLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLDJCQUFzQixHQUFhLElBQUksQ0FBQztRQUN4Qyx5QkFBb0IsR0FBb0IsSUFBSSxDQUFDO1FBQzdDLHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUNyQyxhQUFRLEdBQXFCLGdCQUFnQixDQUFDLElBQUksQ0FBQztRQUNuRCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxVQUFLLEdBQVEsSUFBSSxDQUFDO1FBQ2xCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsaUJBQVksR0FBYSxLQUFLLENBQUM7UUFvQi9CLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFReEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFqQ0QsSUFBYyxJQUFJLENBQUMsS0FBaUI7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELElBQWMsSUFBSTtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFvQk8sYUFBYTtRQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxFQUFpQixDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBbUIsRUFBRSxZQUF3QixFQUFFLGFBQXFCO1FBQ3hGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFPRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksUUFBUSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELEtBQUssR0FBRyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQU1ELE9BQU8sQ0FBQyxNQUFjO1FBQ3BCLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBSWxELElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdCO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQU1ELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBTUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFjRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBYSxFQUFFLE9BQXlCLEVBQUUsTUFBYyxFQUFFLGtCQUEyQixFQUFFLFdBQTZCLEVBQUUsY0FBdUIsRUFBRSxZQUErQjtRQUNyTSxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEosQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWE7UUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQVVELG1CQUFtQixDQUFDLE1BQWM7UUFDaEMsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNTyxjQUFjLENBQUMsTUFBa0I7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQU1ELFlBQVksQ0FBQyxpQkFBMEI7UUFDckMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLElBQUksaUJBQWlCLEVBQUU7WUFJckQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQ2hDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBTzlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQ2pDO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQztJQVVELEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBbUIsRUFBRSxJQUFZLEVBQUUsWUFBcUI7UUFDckUsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFNRCxZQUFZLENBQUMsT0FBZTtRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFNRCxtQkFBbUIsQ0FBQyxPQUFlO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQVFELFFBQVEsQ0FBQyxNQUFrQixFQUFFLE1BQWMsRUFBRSxNQUFpQjtRQUM1RCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7U0FDMUQ7UUFLRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNCO2FBQ0k7WUFHSCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDbkMsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3JDLEtBQUssYUFBYSxDQUFDLGdCQUFnQjtvQkFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUk7d0JBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO29CQUN6QyxNQUFNO2dCQUNSLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDbkMsS0FBSyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3BDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO2dCQUNyQyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7Z0JBQ25DLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO2dCQUN2QyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLEtBQUssYUFBYSxDQUFDLGNBQWM7b0JBQy9CLE1BQU07Z0JBQ1I7b0JBQ0UsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsNEVBQTRFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3BJLE1BQU07YUFDVDtTQUNGO1FBRUQsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRzNCLENBQUM7SUFPRCxnQkFBZ0IsQ0FBQyxZQUFvQixFQUFFLE1BQWlCO1FBQ3RELElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFHZixJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsV0FBVyxFQUFFO1lBQzdDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO2dCQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FFM0M7YUFDSSxJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsY0FBYztZQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzFCLElBQUksWUFBWSxLQUFLLGFBQWE7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCLElBQUksWUFBWSxLQUFLLEdBQUcsR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFO1lBQzNELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7YUFDSTtZQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHFGQUFxRixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDaEosT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQWlCO1FBQ3hDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLElBQUksU0FBUyxHQUFXLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzNELElBQUksb0JBQW9CLEdBQW9CLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBRWpELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFLTyxlQUFlLENBQUMsTUFBaUI7UUFDdkMsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFakYsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFHaEUsSUFBSSxHQUFHLEdBQVcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFcEcsSUFBSSxNQUFNLEdBQWlCLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQVE7WUFFdkgsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BELElBQUksU0FBUyxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLElBQUksUUFBUSxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUU5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN4QztZQUNELE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO2FBQ0k7WUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsNENBQTRDLENBQUMsQ0FBQztTQUMxRTtJQUNILENBQUM7SUFLRCxZQUFZLENBQUMsU0FBaUIsRUFBRSxRQUFnQjtRQUM5QyxJQUFJLGNBQWMsR0FBWSxJQUFJLENBQUM7UUFFbkMsUUFBUSxTQUFTLEVBQUU7WUFDakIsS0FBSyxZQUFZLENBQUMsWUFBWTtnQkFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFrQixDQUFDO2dCQUN6QyxNQUFNO1lBQ1IsS0FBSyxZQUFZLENBQUMsaUJBQWlCO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxxQkFBcUI7Z0JBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxpQkFBaUI7Z0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxNQUFNO1lBQ1IsS0FBSyxZQUFZLENBQUMsVUFBVTtnQkFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsS0FBSyxZQUFZLENBQUMsbUJBQW1CO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlDLE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxnQkFBZ0I7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsTUFBTTtZQUNSLEtBQUssWUFBWSxDQUFDLHVCQUF1QjtnQkFFdkMsTUFBTTtZQUNSLEtBQUssWUFBWSxDQUFDLDRCQUE0QjtnQkFFNUMsTUFBTTtZQUNSO2dCQUNFLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLE1BQU07U0FDVDtRQUVELE9BQU8sY0FBYyxDQUFDO0lBRXhCLENBQUM7SUFJRCxRQUFRO1FBQ04sSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNsQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQ2I7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxFQUFFO1NBRzVDO2FBQ0k7WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsUUFBZ0I7UUFDbkMsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ3JCLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDZjtRQUNELFFBQVEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQzFCLFFBQVEsR0FBRyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7UUFFM0MsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDeEIsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3BHO2FBQ0k7WUFDSCxRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzFILFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzlGO0lBUUgsQ0FBQztJQU1PLFlBQVksQ0FBQyxZQUFvQjtRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO1FBQ3JDLElBQUksU0FBUyxHQUFrQixJQUFJLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsRUFBRTtZQUMxRSxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUMvQjtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFLRCxPQUFPO1FBS0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFNRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQU1ELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUlELGNBQWMsQ0FBQyxlQUF3QjtRQUNyQyxJQUFJLElBQUksR0FBVyxDQUFDLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFO1lBQ3BFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM5QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU1ELFNBQVM7UUFDUCxJQUFJLE1BQU0sR0FBWSxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdGLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNsRTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFNRCxZQUFZO1FBRVYsSUFBSSxVQUFVLEdBQVksSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRyxJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUM1RixJQUFJLGFBQWEsR0FBWSxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTdHLElBQUksTUFBTSxHQUFZLFVBQVUsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2pDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMxRztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxTQUFTO1FBQ1AsSUFBSSxRQUFRLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxHQUFHLEdBQWEsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7WUFDakMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDNUg7YUFDSTtZQUNILElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsR0FBRyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFNRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQWEsQ0FBQztRQUNsQixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QzthQUNJO1lBQ0gsSUFBSSxHQUFZLE9BQU8sQ0FBQztTQUN6QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU9ELGFBQWEsQ0FBQyxRQUFpQjtRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFHRCxNQUFNLENBQUMsTUFBYztRQUduQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2pIO2FBQ0k7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXhGLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQU1ELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUlELFNBQVM7UUFDUCxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9CLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN0RDthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QztTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUtELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQU1ELFFBQVEsQ0FBQyxpQkFBc0I7UUFDN0IsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLElBQUksaUJBQWlCLFlBQVksWUFBWSxFQUFFO1lBQzNFLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUdPLFVBQVUsQ0FBQyxLQUFtQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBTU8sVUFBVSxDQUFDLFVBQWtCO1FBQ25DLElBQUksV0FBVyxHQUFpQixJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEUsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLE9BQU87U0FDUjtRQUNELE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxtREFBbUQsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBT0QsU0FBUyxDQUFDLE1BQWMsRUFBRSxLQUFhO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQU1ELFFBQVEsQ0FBQyxRQUFnQjtRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0lBTUQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQU9ELGdCQUFnQixDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQzdDLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQztTQUNiO2FBQ0k7WUFDSCxJQUFJLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQixPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUtPLFdBQVc7UUFDakIsSUFBSSxNQUF5QixDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDckIsTUFBTSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0RjthQUNJO1lBQ0gsTUFBTSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUtELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUtELGNBQWMsQ0FBQyxNQUFXO1FBRXhCLElBQUksRUFBcUIsQ0FBQztRQUMxQixFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0MsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBR2QsSUFBSSxHQUFHLEdBQVMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBS0QsUUFBUSxDQUFDLE1BQVc7UUFFbEIsSUFBSSxFQUFxQixDQUFDO1FBQzFCLElBQUksUUFBUSxHQUFZLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBRS9CLElBQUksRUFBRSxDQUFDLGdCQUFnQjtZQUNyQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7O1lBRXZCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFLTyxrQkFBa0IsQ0FBQyxRQUFnQjtRQUV6QyxJQUFJLFNBQVMsR0FBcUIsSUFBSSxRQUFRLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksVUFBVSxHQUFxQixJQUFJLFFBQVEsQ0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEUsSUFBSSxHQUFHLEdBQStCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDaEMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBTUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFNRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFPRCxVQUFVLENBQUMsWUFBb0I7UUFFN0IsSUFBSSxTQUFTLEdBQVcsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFHcEgsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxDQUFDLEVBQUU7WUFDOUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFNRCx1QkFBdUI7UUFDckIsSUFBSSxjQUFjLEdBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBDLElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxNQUFNLEdBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVEsQ0FBQztZQUM3QyxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xELEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRSxJQUFJLEdBQUcsR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBTUQsMEJBQTBCO1FBQ3hCLE9BQU8sS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFNRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3hHLENBQUM7SUFNRCxrQkFBa0I7UUFDaEIsT0FBTyxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUU7SUFDdkcsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBU0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsTUFBZTtRQUdqRSxJQUFJLHVCQUF1QixHQUFZLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBRXpFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixJQUFJLGFBQWEsR0FBWSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7UUFDcEgsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDL0osQ0FBQztJQUdELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBWSxFQUFFLGlCQUEwQjtRQUN4RCxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUM7YUFDSTtZQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekM7SUFFSCxDQUFDO0lBTU8sV0FBVyxDQUFDLElBQVk7UUFDOUIsSUFBSSxLQUFLLEdBQWEsSUFBSSxLQUFLLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQU1PLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBWTtRQUN0QyxJQUFJLFFBQVEsR0FBYTtZQUN2QixNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUs7U0FDckIsQ0FBQztRQUNGLElBQUksTUFBTSxHQUFhO1lBQ3JCLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtTQUNqQixDQUFDO1FBQ0YsSUFBSSxJQUFJLEdBQWdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRCxJQUFJLFFBQVEsR0FBb0IsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QyxJQUFJLEdBQUcsR0FBYSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkMsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDO1FBQ2pDLElBQUksYUFBYSxHQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLFlBQVksR0FBWSxJQUFJLENBQUM7UUFDakMsSUFBSSxZQUFZLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxRQUFRLEdBQXFCLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0MsSUFBSSwrQkFBK0IsR0FBWSxLQUFLLENBQUM7UUFFckQsSUFBSTtZQUdGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2xHLElBQUksUUFBUSxLQUFLLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtvQkFDN0MsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDM0M7Z0JBQ0QsSUFBSSxRQUFRLEdBQWEsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLFFBQVEsR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLFFBQVEsR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDckUsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO29CQUNyQixhQUFhLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzNDO2dCQUNELElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtvQkFDckIsYUFBYSxHQUFHLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUMzQztnQkFDRCxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN2RSxhQUFhLEdBQUcsRUFBRSxDQUFDO2lCQUNwQjtnQkFDRCxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ3BFLGFBQWEsR0FBRyxhQUFhLENBQUM7cUJBQy9CO3lCQUNJO3dCQUNILGFBQWEsR0FBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQztxQkFDdEM7b0JBQ0QsK0JBQStCLEdBQUcsSUFBSSxDQUFDO2lCQUN4QztnQkFDRCxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUN6QyxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQ3JFO2dCQUNELElBQUksT0FBTyxHQUFXLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRixJQUFJLElBQUksR0FBYSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxRQUFRLEdBQVcsQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxXQUFXLEdBQVcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3BGLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxXQUFXLEdBQVcsQ0FBQyxXQUFXLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakUsSUFBSSxRQUFRLEtBQUssV0FBVyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQy9DLGFBQWEsR0FBRyxhQUFhLENBQUM7b0JBQzlCLCtCQUErQixHQUFHLElBQUksQ0FBQztpQkFDeEM7Z0JBQ0QsSUFBSSxJQUFJLEdBQVcsUUFBUSxDQUFDO2dCQUM1QixJQUFJLFVBQVUsR0FBYSxJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxFQUFFO29CQUNySCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDNUQ7Z0JBR0QsSUFBSSxhQUFhLEdBQWEsV0FBVyxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDakksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLFVBQVUsR0FBYSxXQUFXLENBQUMsd0JBQXdCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDeEssSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQzVCLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQzFDO2dCQUdELElBQUksS0FBSyxHQUFXLElBQUksQ0FBQztnQkFDekIsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLFdBQTBCLENBQUM7Z0JBRS9CLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLE9BQU8sR0FBVyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDdkYsT0FBTyxHQUFHLE9BQU8sQ0FBQztvQkFDbEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUV4QyxJQUFJLE9BQU8sS0FBSyxPQUFPO3dCQUNyQixLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQzt5QkFDcEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3ZCLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDckM7eUJBQ0k7d0JBQ0gsS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUM3RCxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7cUJBQzVEO29CQUVELE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO29CQUV0QixRQUFRLFFBQVEsRUFBRTt3QkFDaEIsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7d0JBQzVCLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUMzQixLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQzt3QkFDOUIsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXOzRCQUMvQixLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDN0IsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ3JDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0NBQ2hDLFdBQVcsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dDQUNsQyxLQUFLLElBQUksUUFBUSxHQUFXLENBQUMsRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7b0NBQ3BFLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUk7d0NBQzlCLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7eUNBQ2pDLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3Q0FDeEMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FFNUIsS0FBSyxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs2QkFDaEM7NEJBQ0QsS0FBSyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQ3RELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0NBQy9DLEtBQUssR0FBRyxXQUFXLENBQUMseUJBQXlCLENBQUMsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs0QkFHMUUsSUFBSSxlQUFlLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxFQUFFO2dDQUNoRixJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFlBQVk7b0NBQ25FLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQzs2QkFDdEQ7aUNBQ0k7Z0NBQ0gsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxZQUFZO29DQUNwRCxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7NkJBQ3pDOzRCQUVELFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ3RCLE1BQU07d0JBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7d0JBQzlCLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUMzQixLQUFLLGdCQUFnQixDQUFDLElBQUk7NEJBQ3hCLElBQUksT0FBTyxHQUFRLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQy9FLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUN6QyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ2pCLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDOzRCQUNqRixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNyRSxNQUFNO3dCQUVSLEtBQUssZ0JBQWdCLENBQUMsT0FBTzs0QkFDM0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUNuQyxNQUFNO3dCQUVSOzRCQUNFLE1BQU07cUJBQ1Q7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLFlBQVk7b0JBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQjtTQUNGO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsWUFBWSxTQUFTLEVBQUU7Z0JBQzNCLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDbkY7O2dCQUVDLE1BQU0sRUFBRSxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsWUFBWSxDQUFDO0lBRzdDLENBQUM7SUFNRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUtPLE1BQU07UUFDWixRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBTUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFZO1FBQzNCLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQztRQUV6QixJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QixLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUM3QjthQUNJO1lBQ0gsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFFdEUsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFN0MsSUFBSSxJQUFJLEdBQUcsQ0FBQztvQkFDVixJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUVYLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtvQkFDN0IsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFL0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztvQkFDeEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBR3pDLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRTtvQkFDbEIsS0FBSyxHQUFHLE9BQU8sQ0FBQztpQkFDakI7cUJBQ0k7b0JBQ0gsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ2hEO2dCQUNELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtvQkFDbEIsSUFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO29CQUs1QixJQUFJLFFBQVEsR0FBcUIsSUFBSSxRQUFRLENBQVMsS0FBSyxDQUFDLENBQUM7b0JBQzdELElBQUksU0FBUyxHQUFzQixJQUFJLFFBQVEsQ0FBVSxNQUFNLENBQUMsQ0FBQztvQkFFakUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTt3QkFDeEIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7cUJBQ3hCO2lCQUNGO2FBQ0Y7aUJBQ0k7Z0JBQ0gsSUFBSSxlQUFlLEdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3BILEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQzthQUN2SDtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBUUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFzQixFQUFFLElBQVk7UUFDckQsSUFBSSxJQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBSSxJQUFJLEdBQWlCLElBQUksSUFBSSxFQUFVLENBQUM7UUFFNUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9CLElBQUksVUFBVSxHQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVELElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtZQUV2QixJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztTQUMxQjtRQUNELElBQUksVUFBVSxHQUFhLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFdEYsSUFBSSxNQUFNLEdBQWEsVUFBVSxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BELElBQUksR0FBRyxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ2YsSUFBSSxNQUFNLEdBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDNUM7aUJBQ0k7Z0JBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFO29CQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUM1QjtxQkFDSTtvQkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNqQjthQUNGO1NBQ0Y7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsV0FBVyxFQUFFO1lBQ2xELElBQUksVUFBVSxHQUFlLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzdELEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUM5RCxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQ3BGO1lBQ0QsTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNoQzthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7aUJBQ0k7Z0JBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0I7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFLTyxPQUFPO1FBQ2IsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLGtCQUFrQixHQUFRLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekMsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDcEIsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7WUFFeEYsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBa0IsY0FBYyxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBR3hJLENBQUM7SUFPTyxlQUFlLENBQUMsS0FBYTtRQUVuQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRixRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFHdkIsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLGlCQUFpQixFQUFFO1lBQzVDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUlELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUN2QztJQUNILENBQUM7SUFRTyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUNsRCxJQUFJLFVBQVUsR0FBWSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBT08sS0FBSyxDQUFDLGlDQUFpQyxDQUFDLElBQVksRUFBRSxZQUFxQjtRQUNqRixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQzdCLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUd2QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDckI7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFRbkQsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDcEIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQU1ELFFBQVEsQ0FBQyxJQUFZO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBS0QsWUFBWSxDQUFDLEdBQVc7SUFFeEIsQ0FBQztJQVNELEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxNQUFjLEVBQUUsV0FBd0IsRUFBRSxHQUFZLEVBQUUsVUFBbUI7UUFJMUcsSUFBSSxVQUFVLEVBQUU7WUFFZCxRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDMUQsV0FBVyxLQUFLLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztTQUVwSTtRQUVELE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFZO1FBQ3JCLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekgsQ0FBQztJQVFELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsV0FBd0IsRUFBRSxHQUFZO1FBRWxGLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFJM0IsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUVsRSxJQUFJLEtBQUssR0FBa0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTVELElBQUksS0FBSyxDQUFDLHFCQUFxQixFQUFFO29CQUMvQixTQUFTO2dCQUVYLElBQUksVUFBVSxHQUFZLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUUzRSxVQUFVLEdBQUcsVUFBVSxJQUFJLEdBQUcsQ0FBQztnQkFFL0IsSUFBSSxtQkFBbUIsR0FBWSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXJFLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtvQkFFaEQsSUFBSSxVQUFVLEVBQUU7d0JBQ2QsVUFBVSxHQUFHLG1CQUFtQixDQUFDO3FCQUNsQztvQkFDRCxNQUFNLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUN0RTthQUNGO1lBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDdEU7U0FDRjtJQUNILENBQUM7SUFNRCxxQkFBcUIsQ0FBQyxPQUFxQjtRQUN6QyxJQUFJLFdBQVcsR0FBWSxLQUFLLENBQUM7UUFFakMsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3BCLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxJQUFJLE1BQU0sWUFBWSxhQUFhLEVBQUU7Z0JBQ25DLElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRTtvQkFDdEIsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDcEI7cUJBQ0k7b0JBS0gsSUFBSSxhQUFhLEdBQWtCLENBQUMsQ0FBQyxNQUFNLFlBQVksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFnQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0RyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUs7d0JBQ25LLFdBQVcsR0FBRyxJQUFJLENBQUM7O3dCQUVuQixXQUFXLEdBQUcsQ0FBaUIsTUFBTyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQzFFO2FBQ0Y7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFRRCw4QkFBOEIsQ0FBQyxNQUFjLEVBQUUsV0FBd0IsRUFBRSxHQUFZO0lBQ3JGLENBQUM7SUFRRCxxQkFBcUIsQ0FBQyxLQUFvQjtRQUN4QyxJQUFJLEdBQUcsR0FBWSxJQUFJLENBQUM7UUFFeEIsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxXQUFXLEdBQVcsQ0FBQyxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ3ZCLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDNUM7WUFDRCxJQUFJLEtBQUssR0FBVyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxXQUFXLEtBQUssS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBRXRDLEdBQUcsR0FBRyxLQUFLLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBTUQsaUJBQWlCO1FBQ2YsSUFBSSxXQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRTVCLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNyRCxJQUFJLGFBQWEsR0FBYSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUM3RCxJQUFJLGNBQWMsR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkUsV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFPRCxtQkFBbUIsQ0FBQyxNQUFnQjtRQUNsQyxJQUFJLE1BQU0sR0FBYSxJQUFJLEtBQUssQ0FBUyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEQsS0FBSyxJQUFJLElBQUksR0FBVyxDQUFDLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxHQUFHLEdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFbkIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO29CQUNaLElBQUksR0FBRyxDQUFDLENBQUM7aUJBQ1Y7Z0JBQ0QsSUFBSSxTQUFTLEdBQWEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUN4RDthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBT08sbUJBQW1CLENBQUMsTUFBZ0I7UUFDMUMsSUFBSSxVQUFVLEdBQWEsSUFBSSxLQUFLLENBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ2hFLElBQUksS0FBSyxHQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQ2IsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDdEI7cUJBQ0k7b0JBQ0gsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO3dCQUNaLElBQUksR0FBRyxDQUFDLENBQUM7cUJBQ1Y7b0JBQ0QsSUFBSSxTQUFTLEdBQWEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRTt3QkFDaEgsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN4RDtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBUUQsaUJBQWlCLENBQUMsTUFBYztRQUM5QixJQUFJLE1BQU0sR0FBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxJQUFJLE1BQU0sR0FBaUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RSxJQUFJLE1BQWUsQ0FBQztRQUVwQixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFFbkIsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNmO2FBQ0k7WUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDcEQsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNoQjtpQkFDSTtnQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFO29CQUd2QyxNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUNoQjtxQkFDSTtvQkFFSCxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDdkg7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQU9ELGVBQWUsQ0FBQyxrQkFBMkI7UUFFekMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUNwRDthQUNJO1lBQ0gsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUMvQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDbkM7aUJBQ0k7Z0JBQ0gsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO0lBQ0gsQ0FBQztJQU1ELGVBQWUsQ0FBQyxNQUFlO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQU1ELGVBQWU7UUFDYixJQUFJLElBQUksR0FBVyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQWEsQ0FBQztRQUNsQixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6QzthQUNJO1lBQ0gsSUFBSSxHQUFZLE9BQU8sQ0FBQztTQUN6QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQU1ELFFBQVE7UUFDTixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxHQUFHLEdBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QzthQUNJO1lBQ0gsSUFBSSxHQUFXLEdBQUcsQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtPLFlBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFTTyxhQUFhLENBQUMsTUFBYztRQUNsQyxJQUFJLE9BQU8sR0FBWSxJQUFJLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2pHLElBQUksVUFBVSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7WUFDMUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDNUIsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUNqQjtTQUNGO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQU9PLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxjQUF3QixFQUFFLElBQVk7UUFFckUsSUFBSSxjQUFjLEdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQUksWUFBWSxHQUFpQixJQUFJLElBQUksRUFBVSxDQUFDO1FBQ3BELElBQUksYUFBYSxHQUFpQixJQUFJLElBQUksRUFBVSxDQUFDO1FBQ3JELElBQUksU0FBUyxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFcEYsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQ3RCLGNBQWMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUM3QztRQUVELElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekUsY0FBYyxHQUFHLEVBQUUsQ0FBQztTQUNyQjtRQUNELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxTQUFTLEdBQWEsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxJQUFJLFlBQVksR0FBVyxDQUFDLENBQUMsQ0FBQztZQUM5QixLQUFLLElBQUksS0FBSyxHQUFXLENBQUMsRUFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDdkUsSUFBSSxnQkFBZ0IsR0FBVyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNyRCxJQUFJLGVBQWUsR0FBcUIsSUFBSSxRQUFRLENBQVMsWUFBWSxDQUFDLENBQUM7b0JBQzNFLElBQUksUUFBUSxHQUFZLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQzVFLFlBQVksR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO29CQUtyQyxJQUFJLFFBQVEsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFO3dCQUN6RSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQzdELGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztxQkFDdEM7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsSUFBSSxNQUFnQixDQUFDO1FBQ3JCLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsTUFBTSxHQUFHLGNBQWMsQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVEO2FBQ0k7WUFDSCxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQVMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELEtBQUssSUFBSSxHQUFHLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRztnQkFDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUVyQixNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUtELFlBQVk7UUFDVixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBS0Qsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQU1ELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFLRCxVQUFVLENBQUMsSUFBWTtRQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBTUQsc0JBQXNCO1FBQ3BCLElBQUksR0FBRyxHQUFZLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUU7Z0JBQ3JDLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDWjtpQkFJSTtnQkFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN2SCxHQUFHLEdBQUcsSUFBSSxDQUFDO2lCQUNaO2FBQ0Y7U0FDRjthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixHQUFHLEdBQUcsSUFBSSxDQUFDO2FBQ1o7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQU1ELHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQzVGLENBQUM7SUFRTyxNQUFNLENBQUMsbUJBQW1CLENBQUMsWUFBc0IsRUFBRSxXQUFxQjtRQUM5RSxJQUFJLE1BQU0sR0FBYSxJQUFJLEtBQUssRUFBVSxDQUFDO1FBRTNDLElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdkMsSUFBSSxXQUFXLEtBQUssSUFBSTtZQUN0QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBR0QsMEJBQTBCLENBQUMsTUFBYyxFQUFFLGFBQXNCLEVBQUUsSUFBYTtRQUM5RSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxFQUFFO1lBQ3JKLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNqRTtRQUNELE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQU9PLDRCQUE0QixDQUFDLE1BQWMsRUFBRSxhQUFzQjtRQUN6RSxJQUFJLE1BQU0sR0FBWSxhQUFhLENBQUM7UUFDcEMsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixNQUFNLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDekM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBU08sNEJBQTRCLENBQUMsTUFBYyxFQUFFLGFBQXNCLEVBQUUsSUFBWTtRQUN2RixJQUFJLE1BQU0sR0FBWSxhQUFhLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3ZFLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtvQkFDaEIsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUM7YUFDRjtTQUNGO2FBQ0k7WUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNqRTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFVRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBYyxFQUFFLGFBQXNCLEVBQUUsSUFBWTtRQUMxRSxJQUFJLE1BQU0sR0FBWSxhQUFhLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3ZFLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsR0FBVyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7b0JBQ2hCLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzFDO2FBQ0Y7U0FDRjthQUNJO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDdEQ7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBT0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFjLEVBQUUsYUFBc0I7UUFDcEQsSUFBSSxNQUFNLEdBQVksYUFBYSxDQUFDO1FBQ3BDLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN2QztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFPRCxvQkFBb0IsQ0FBQyxNQUFjO1FBQ2pDLElBQUksWUFBWSxHQUFZLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDOUMsSUFBSSxZQUFZLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDYjthQUNJO1lBQ0gsT0FBTyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDakU7SUFDSCxDQUFDO0lBT0QsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEtBQWEsRUFBRSxNQUFlO1FBQzVELElBQUksY0FBYyxHQUFZLElBQUksQ0FBQztRQUVuQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFFaEIsSUFBSSxDQUFDLE1BQU07Z0JBQ1QsS0FBSyxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEQ7YUFDSTtZQUNILElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFO2dCQUMzQixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7b0JBQ1osSUFBSSxHQUFHLENBQUMsQ0FBQztpQkFDVjtnQkFDRCxJQUFJLE1BQU0sR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQU1sRyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUN6QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNkLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM1RCxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTt3QkFDMUMsTUFBb0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztxQkFDMUc7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xELGNBQWMsR0FBRyxLQUFLLENBQUM7YUFDeEI7U0FDRjtRQUtELElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFO2dCQUNsRyxJQUFJO29CQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUU7d0JBQ2hHLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3FCQUNwQjt5QkFDSTt3QkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUN4TixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt5QkFDcEI7NkJBQ0k7NEJBQ0gsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDeEMsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7eUJBQ2hLO3FCQUNGO29CQUdELElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7d0JBQ3hGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztxQkFDbkI7aUJBQ0Y7Z0JBQUMsT0FBTyxjQUFjLEVBQUU7b0JBQ3ZCLElBQUksY0FBYyxZQUFZLG9CQUFvQixFQUFFO3dCQUNsRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDckksSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7d0JBQ2hCLEtBQUssR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUN0RDs7d0JBRUMsTUFBTSxjQUFjLENBQUM7aUJBQ3hCO2FBQ0Y7aUJBQ0k7Z0JBQ0gsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBRS9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ3RCO1NBQ0Y7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ2hHLEtBQUssR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBSUQsb0JBQW9CLENBQUMsUUFBZ0I7UUFLbkMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFO1lBQ2pELElBQUksY0FBYyxHQUFZLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDMUMsSUFBSSxVQUFVLEdBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRzFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRTtvQkFDckMsVUFBVSxHQUFHLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDOUQ7YUFDRjtZQUNELElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1NBQ0Y7SUFDSCxDQUFDO0lBS08sVUFBVTtRQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ2hHLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUM7YUFDSTtZQUNILElBQUksa0JBQWtCLEdBQVcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFFOUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsRUFBRTtnQkFDMUMsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFHeEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFFdEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzVEO1lBR0QsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUM7U0FDRjtJQUNILENBQUM7SUFLTyxxQkFBcUI7UUFDM0IsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUdsRCxPQUFPLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDM0QsU0FBUyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBS0QsV0FBVyxDQUFDLEdBQVc7UUFDckIsSUFBSSxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO1lBQ25ELGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUN6QjtRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQU1ELDBCQUEwQjtRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFLRCxZQUFZLENBQUMsR0FBVztRQUN0QixJQUFJLE1BQWUsQ0FBQztRQUNwQixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDWixJQUFJLE1BQU0sR0FBYSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO2FBQ0k7WUFDSCxPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUlELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxZQUFxQjtRQUN2RCxJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLElBQUksWUFBcUIsQ0FBQztZQUMxQixJQUFJLGVBQWUsR0FBc0IsSUFBSSxRQUFRLENBQVUsWUFBWSxDQUFDLENBQUM7WUFFN0UsSUFBSSxNQUFNLEdBQ1IsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDekksWUFBWSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDckMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7YUFDL0Q7U0FDRjthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDeEIsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO2dCQUM1QixJQUFJLFFBQVEsR0FBcUIsSUFBSSxRQUFRLENBQVMsS0FBSyxDQUFDLENBQUM7Z0JBQzdELElBQUksU0FBUyxHQUFzQixJQUFJLFFBQVEsQ0FBVSxNQUFNLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDNUYsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUN6QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDckQ7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtvQkFDdkQsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM1QzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBT0QsMkJBQTJCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtZQUNuSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuSCxDQUFDO0lBTUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQWE7UUFDckMsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLFlBQVksR0FBWSxJQUFJLENBQUM7UUFDakMsSUFBSSxnQkFBZ0IsR0FBWSxZQUFZLENBQUM7UUFFN0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ1osSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNWO1FBS0QsSUFBSTtZQUVGLElBQUksU0FBUyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksUUFBUSxHQUFZLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUU3QyxJQUFJLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDN0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO29CQUNuRCxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZFLFlBQVksR0FBRyxLQUFLLENBQUM7aUJBQ3RCO2dCQUVELElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQzVCLFlBQVksR0FBRyxJQUFJLENBQUM7aUJBQ3JCO2FBQ0Y7aUJBQ0k7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUM7b0JBQ2hFLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBRXZCLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxNQUFNO29CQUMxQixZQUFZLEdBQUcsSUFBSSxDQUFDO2FBRXZCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWhDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO2dCQUNuQyxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDcEMsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO2dCQUNuQyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDckMsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO2dCQUNuQyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO2dCQUN2QyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3RDLEtBQUssYUFBYSxDQUFDLGNBQWM7b0JBQy9CLE9BQU87Z0JBRVQsS0FBSyxhQUFhLENBQUMsaUJBQWlCO29CQUNsQyxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7d0JBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsT0FBTztnQkFFVCxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7Z0JBQ25DLEtBQUssYUFBYSxDQUFDLGtCQUFrQjtvQkFDbkMsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO3dCQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLE9BQU87Z0JBRVQsS0FBSyxhQUFhLENBQUMsa0JBQWtCO29CQUNuQyxJQUFJLFlBQVksSUFBSyxJQUFJLENBQUMsWUFBWTt3QkFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDckMsT0FBTztnQkFFVCxLQUFLLGFBQWEsQ0FBQyxhQUFhLENBQUM7Z0JBQ2pDLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDbkMsS0FBSyxhQUFhLENBQUMsY0FBYztvQkFDL0IsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO29CQUNoQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNoRixJQUFJLFlBQVksRUFBRTt3QkFFaEIsSUFBSSxnQkFBZ0IsR0FBYSxJQUFJLENBQUM7d0JBS3RDLElBQUksZ0JBQWdCLEtBQUssWUFBWSxFQUFFOzRCQUNyQyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7Z0NBQ3RCLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BHLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7b0NBQzlELElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLGlCQUFpQixFQUFFO3dDQUMxRCxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUM7cUNBQ3ZEO2lDQUNGOzZCQUNGO3lCQUNGO3dCQUNELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUUxQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTs0QkFDdkIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7NEJBQzVDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzs0QkFDeEgsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3lCQUM1SDt3QkFFRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFOzRCQUNyQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3lCQUN0RTs7NEJBRUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDN0U7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDcEMsS0FBSyxhQUFhLENBQUMsY0FBYztvQkFDL0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO3dCQUN4QixNQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ25FLElBQUksWUFBWSxFQUFFO3dCQUdoQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTs0QkFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDdkM7OzRCQUVDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDbEI7O3dCQUVDLE9BQU87b0JBQ1QsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyxlQUFlO29CQUNoQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNoRixJQUFJLENBQUMsWUFBWTt3QkFDZixPQUFPO29CQUNULElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUlqQyxNQUFNO2dCQUVSO29CQUNFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9EQUFvRCxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUM1RyxPQUFPO2FBQ1Y7WUFFRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxZQUFZO2dCQUN6QyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDNUs7UUFBQyxPQUFPLE1BQU0sRUFBRTtZQUNmLElBQUksTUFBTSxZQUFZLFNBQVMsRUFBRTtnQkFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsbURBQW1ELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDNUc7O2dCQUVDLE1BQU0sTUFBTSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQUMsbUJBQTZCO1FBQ2hELElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7WUFDeEMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQU1PLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBNEI7UUFHekQsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUU7WUFHMUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUdsRCxJQUFJLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxFQUFFO2dCQUM5QyxNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqRDtZQUdELElBQUksY0FBYyxHQUFZLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFFLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTdGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLGNBQWMsRUFBRTtnQkFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDckMsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2FBQ3hEO1lBRUQsSUFBSSxpQkFBaUIsR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFHL0YsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLElBQUksaUJBQWlCLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBRWpFLElBQUksYUFBYSxHQUFZLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRXhHLElBQUksYUFBYSxLQUFLLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDO29CQUNuRixRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDdkk7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7Z0JBQ3hFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUUxSDtJQUNILENBQUM7SUFPRCxtQ0FBbUM7UUFDakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLG1CQUE0QjtRQUVsRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyx1QkFBdUI7WUFDakcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZGLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDMUIsSUFBSTtnQkFFRixJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7aUJBQ3pDO2dCQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUMsRUFBRTtvQkFDckUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0RBQWdELEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDOUc7Z0JBRUQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTt3QkFDeEIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztxQkFDdEM7aUJBQ0Y7YUFDRjtZQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxZQUFZLFNBQVMsRUFBRTtvQkFDM0IsSUFBSSxHQUFHLEdBQWtCLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUM3RyxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7aUJBQzVDOztvQkFFQyxNQUFNLEVBQUUsQ0FBQzthQUNaO1NBQ0Y7SUFDSCxDQUFDO0lBSUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQVk7UUFDdkMsSUFBSSxnQkFBZ0IsR0FBVyxJQUFJLENBQUM7UUFNcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ3pCLElBQUksTUFBTSxHQUFhLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3RELElBQUksWUFBWSxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUN6QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDO0lBT0QsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLElBQVksRUFBRSxpQkFBMEI7UUFHakYsSUFBSSxXQUFXLEdBQWEsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUzRSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3RELElBQUksS0FBSyxHQUFXLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBR0gsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFPRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBWSxFQUFFLGlCQUEwQjtRQUNuRSxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxJQUFJLGNBQWMsR0FBYSxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFFN0UsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdkQsT0FBTyxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQTtZQUM5QixDQUFDLENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUV4RzthQUNJO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzFFO1NBQ0Y7SUFDSCxDQUFDO0lBS0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGlCQUEwQjtRQUMvQyxJQUFJLFNBQVMsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTdDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDN0IsSUFBSSxRQUFRLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDbEUsSUFBSSxHQUFHLEdBQWEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEQsSUFBSSxRQUFRLEdBQWEsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRXpFLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUMvQixTQUFTLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUM1RTtTQUNGO2FBQ0k7WUFDSCxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQU9ELEtBQUssQ0FBQyxlQUFlLENBQUMsaUJBQTBCO1FBRzlDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFJLGNBQWMsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksaUJBQWlCLEVBQUU7WUFDckIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxRQUFRLEdBQWEsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxRQUFRLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxHQUFHLEdBQWEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsY0FBYyxHQUFHLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDakY7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBTUQsS0FBSyxDQUFDLGFBQWE7UUFDakIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQU1ELEtBQUssQ0FBQyxlQUFlO1FBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQU1PLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBVTlDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUMsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFPTyxrQkFBa0IsQ0FBQyxrQkFBMEI7UUFDbkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0lBQ2hELENBQUM7SUFRRCxZQUFZLENBQUMsTUFBVyxFQUFFLEdBQVE7UUFFaEMsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNuRCxPQUFPLElBQUksQ0FBQztRQUVkLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdFO2FBQ0k7WUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QjtRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBU0QsZ0JBQWdCLENBQUMsUUFBYSxFQUFFLE1BQWUsRUFBRSxjQUF1QjtRQUV0RSxJQUFJLGFBQWEsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BDLElBQUksVUFBVSxHQUFZLEtBQUssQ0FBQztRQUVoQyxJQUFJLFFBQVEsWUFBWSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3pDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDOztnQkFFeEQsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDM0Q7UUFFRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFNBQVMsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO2dCQUMvRCxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLFVBQVUsR0FBRyxDQUFDLFdBQVcsS0FBSyxhQUFhLENBQUMsQ0FBQzthQUM5QztpQkFDSTtnQkFDSCxVQUFVLEdBQUcsQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDLENBQUM7YUFDM0M7U0FDRjthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzFGLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hELFVBQVUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDN0U7aUJBQ0k7Z0JBQ0gsSUFBSSxjQUFjLEdBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLFVBQVUsSUFBSSxjQUFjLEVBQUU7b0JBQ2pDLFVBQVUsR0FBRyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsQ0FBQztpQkFDMUM7YUFDRjtTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFRLEVBQUUsRUFBUTtRQUM1QixJQUFJLE1BQWUsQ0FBQztRQUNwQixJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLElBQUk7WUFDNUIsTUFBTSxHQUFHLElBQUksQ0FBQzthQUNYLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQztZQUNuRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ1osSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRTtlQUN6QyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRTtlQUM3QixFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNsQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBUSxFQUFFLEVBQVE7UUFDNUIsSUFBSSxNQUFlLENBQUM7UUFDcEIsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQzVCLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUM7WUFDbkUsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNaLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUU7ZUFDbkMsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUU7ZUFDbkMsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUU7WUFDdEMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNoQixPQUFPLE1BQU0sQ0FBQztJQUVoQixDQUFDO0lBTUQsZ0JBQWdCO1FBQ2QsSUFBSSxVQUFVLEdBQVksS0FBSyxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDakgsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ3RHO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQU9ELHFCQUFxQjtRQUNuQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQjtZQUM5QyxPQUFPLElBQUksQ0FBQztRQUVkLElBQUksY0FBYyxHQUF3QixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFaEYsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNyTCxDQUFDO0lBUUQsOEJBQThCO1FBQzVCLElBQUksWUFBWSxHQUFrQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvRCxJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUU7WUFDekIsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDO1NBQzFCOztZQUVDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBTUQsUUFBUSxDQUFDLElBQW1CO1FBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFLRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFLRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFNRCxVQUFVLENBQUMsT0FBZTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBT0QsbUJBQW1CO1FBQ2pCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBS0QsSUFBSTtJQUNKLENBQUM7SUFNRCxLQUFLLENBQUMsVUFBVTtRQUNkLE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFNRCx1QkFBdUI7UUFDckIsSUFBSSxJQUFJLEdBQWdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQU1ELEtBQUssQ0FBQyxVQUFVLENBQUMsc0JBQStCO1FBRTlDLElBQUksTUFBZSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU3RCxJQUFJLElBQUksR0FBZ0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWpELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDN0I7UUFFRCxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO1lBQ25HLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLE1BQU0sRUFBRTtZQUVWLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQzthQUN0SDtZQUNELElBQUksTUFBTSxJQUFJLHNCQUFzQixFQUFFO2dCQUNwQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7YUFDakQ7WUFFRCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLElBQUksc0JBQXNCLEVBQUU7Z0JBQ3BFLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDdkw7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxxQ0FBcUM7UUFDbkMsSUFBSSxZQUFZLEdBQVksS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMzRSxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFVRCwwQkFBMEIsQ0FBQyxtQkFBNEI7UUFDckQsSUFBSSxZQUFZLEdBQVksS0FBSyxDQUFDO1FBQ2xDLElBQUksbUJBQW1CLEVBQUU7WUFDdkIsSUFBSSxJQUFJLENBQUMscUNBQXFDLEVBQUUsRUFBRTtnQkFDaEQsWUFBWSxHQUFHLElBQUksQ0FBQzthQUNyQjtTQUNGO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUtELGNBQWM7UUFDWixPQUFPLENBQUMsYUFBYSxDQUFDLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwSCxDQUFDO0lBS0QsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBT0QsY0FBYyxDQUFDLEVBQVU7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUM3RSxDQUFDO0lBSUQsVUFBVSxDQUFDLEdBQVM7UUFDbEIsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBQzlCLElBQUksR0FBRyxZQUFZLElBQUksRUFBRTtZQUN2QixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztnQkFDdkUsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsYUFBYSxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDL0ksQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUNqRztZQUNFLElBQUksZUFBZSxHQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBR25LLElBQUksYUFBYSxHQUFhLElBQUksQ0FBQztZQUNuQyxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxlQUFlLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUM3RztnQkFDRSxhQUFhLEdBQUcsTUFBSyxDQUFDLE1BQU0sZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4RyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7b0JBQy9CLGFBQWEsR0FBRyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7Z0JBQ3BELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUUxRztZQUdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7WUFDeEMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUN6QztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgRGVidWcsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXIsXHJcbiAgaXNOdWxsT3JVbmRlZmluZWRcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7R3VpTWdDb250cm9sfSBmcm9tICcuLi8uLi9ndWkvR3VpTWdDb250cm9sJztcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tICcuLi8uLi9ndWkvUHJvcFBhcmVudEludGVyZmFjZSc7XHJcbmltcG9ydCB7R3VpRmllbGRCYXNlfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2hvaWNlVXRpbHMsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIE1hZ2ljUHJvcGVydGllcyxcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1pc2MsXHJcbiAgU0VRXzJfU1RSLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtNZ0Zvcm1CYXNlfSBmcm9tICcuL01nRm9ybUJhc2UnO1xyXG5pbXBvcnQge1BJQ30gZnJvbSAnLi9QSUMnO1xyXG5pbXBvcnQge1Byb3BUYWJsZX0gZnJvbSAnLi9Qcm9wVGFibGUnO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25EZXRhaWxzfSBmcm9tICcuL1ZhbGlkYXRpb25EZXRhaWxzJztcclxuaW1wb3J0IHtGaWVsZERlZn0gZnJvbSAnLi4vZGF0YS9GaWVsZERlZic7XHJcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gJy4vUHJvcGVydHknO1xyXG5pbXBvcnQge0d1aVRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9HdWlUYXNrQmFzZSc7XHJcbmltcG9ydCB7TWFuYWdlcn0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7Q29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7Q29tbWFuZHN9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSAnLi9Qcm9wSW50ZXJmYWNlJztcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7RGNWYWx1ZXMsIEVNUFRZX0RDUkVGfSBmcm9tICcuLi9kYXRhL0RjVmFsdWVzJztcclxuaW1wb3J0IHtHdWlEYXRhVmlld0Jhc2V9IGZyb20gJy4uL2RhdGEvR3VpRGF0YVZpZXdCYXNlJztcclxuaW1wb3J0IHtEaXNwbGF5Q29udmVydG9yfSBmcm9tICcuL0Rpc3BsYXlDb252ZXJ0b3InO1xyXG5pbXBvcnQge0Jsb2JUeXBlfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHtWZWN0b3JUeXBlfSBmcm9tICcuLi9kYXRhL1ZlY3RvclR5cGUnO1xyXG5pbXBvcnQge09iamVjdFJlZmVyZW5jZX0gZnJvbSAnLi4vLi4vdXRpbC9PYmplY3RSZWZlcmVuY2UnO1xyXG5pbXBvcnQge0d1aUNvbnN0YW50c30gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHtHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyfSBmcm9tICcuL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQge0ZvY3VzTWFuYWdlcn0gZnJvbSAnLi4vLi4vRm9jdXNNYW5hZ2VyJztcclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxjb250cm9sPiAuLi48L2NvbnRyb2w+IHRhZ1xyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWdDb250cm9sQmFzZSBleHRlbmRzIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgaW1wbGVtZW50cyBQcm9wUGFyZW50SW50ZXJmYWNlIHtcclxuXHJcbiAgLy8gZml4ZWQgZGVmZWN0ICM6ODE0OTgsIHdoaWxlIFJUIGlzIHNldCBkZWZhdWx0IHZhbHVlIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgY29udHJvbFxyXG4gIC8vIHRvIHRoZSB2YWx1ZSB3aWxsIHNldCB0byB0aGUgY29udHJvbFxyXG5cclxuICBfZGl0SWR4OiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2xpbmtlZENvbnRyb2xzOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gbnVsbDsgLy8gYXJyYXkgb2YgY29udHJvbHMgdGhhdCBhcmUgbGlua2VkIHRvIHRoaXMgY29udHJvbFxyXG4gIF9maWVsZDogR3VpRmllbGRCYXNlID0gbnVsbDsgLy8gcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBvZiB0aGUgY29udHJvbFxyXG4gIHByaXZhdGUgX3BpY1N0cjogc3RyaW5nID0gbnVsbDtcclxuICBfY2hvaWNlRGlzcHM6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gZm9yIFNFTEVDVCBjb250cm9scywgaG9sZHMgdGhlXHJcbiAgX2Nob2ljZUxheWVyTGlzdDogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyB0aGUgb3JkZXIgb24gd2hpY2ggdGFicyB0byBiZSBkaXNwbGF5ZWRcclxuICBfY2hvaWNlTGlua3M6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gZm9yIFNFTEVDVCBjb250cm9scywgaG9sZHMgdGhlXHJcbiAgX2Nob2ljZU51bXM6IExpc3Q8TlVNX1RZUEVbXT4gPSBudWxsOyAgLy8gZm9yIFNFTEVDVCBjb250cm9scywgd2l0aCBudW1lcmljXHJcbiAgcHJpdmF0ZSBfY29udGFpbmVyRGl0SWR4OiBudW1iZXIgPSAtMTtcclxuICBfY3VyclJlYWRPbmx5OiBMaXN0PGJvb2xlYW4+ID0gbnVsbDsgLy8gYSBoaXN0b3J5IGFycmF5IGZvciByZWFkb25seSBwYXJhbVxyXG4gIHByaXZhdGUgX2RhdGFDdHJsOiBib29sZWFuID0gZmFsc2U7IC8vIFRoZSBkYXRhIGNvbnRyb2wgZmxhZyBzdGF0ZXMgdGhhdCB0aGlzXHJcbiAgX2RjVGFibGVSZWZzOiBMaXN0PG51bWJlcj4gPSBudWxsOyAvLyByZWZlcmVuY2VzIHRvIGRjVmFscyBmb3IgZWFjaCBsaW5lIG9mIGEgY29udHJvbCBpcyBhIGRhdGEgY29udHJvbFxyXG4gIHByaXZhdGUgX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2Zvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSAtMTsgLy8gQ29udHJvbElzbiBvZiB0aGUgY29udHJvbCAoZm9yIHN1YmZvcm0pXHJcbiAgcHJpdmF0ZSBfY29udHJvbElzbjogbnVtYmVyID0gLTE7IC8vIGZvciBjdXJyZW50IGlzblxyXG5cclxuICBwcml2YXRlIF9saW5rZWRQYXJlbnREaXRJZHg6IG51bWJlciA9IC0xOyAvLyBub3QgdHJpZ2dlciBhbnkgZXZlbnQgaGFuZGxlciwgd2hpbGUgcGFya2luZyBpbiB0aGlzIGNvbnRyb2xcclxuICBfb3JnQ2hvaWNlRGlzcHM6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gZm9yIFRBQiBDb250cm9sIHNhdmUgdGhlIG9yZyBvcHRpb24gKHdpdGggdGhlICYpXHJcbiAgX3BhcmVudFRhYmxlOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDsgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBNYWdpYyBUYWJsZSBmb3JcclxuICBfcGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY0V4cEV4aXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9wcmV2SXNOdWxsczogTGlzdDxib29sZWFuPiA9IG51bGw7IC8vIGZvciBOVUxMXHJcbiAgcHJpdmF0ZSBfcHJldlBpY0V4cFJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICBfcHJldlZhbHVlczogTGlzdDxzdHJpbmc+ID0gbnVsbDsgLy8gcmVmZXJlbmNlcyB0byBwcmV2aW91cyB2YWx1ZXMgb2YgdGhlXHJcbiAgX3Byb3BUYWI6IFByb3BUYWJsZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmFuZ2U6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmFuZ2VDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7IC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIHRydWUgaWYgdGhlaXIgcmFuZ2VcclxuICBwcml2YXRlIF9ydGZWYWw6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7IC8vIGZpZWxkIHRvIHN0b3JlIHRoZSBydGYgdGV4dCBvZiByaWNoIGVkaXQgY29udHJvbFxyXG4gIF92YWxFeHBJZDogbnVtYmVyID0gMDsgLy8gcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBleHByZXNzaW9uXHJcbiAgcHJpdmF0ZSBfdmQ6IFZhbGlkYXRpb25EZXRhaWxzID0gbnVsbDtcclxuICBwcml2YXRlIF9kY1ZhbElkOiBudW1iZXIgPSAtMjtcclxuICBwYXJlbnQ6IG51bWJlciA9IDA7XHJcbiAgdmVlSW5keDogbnVtYmVyID0gMDtcclxuICBETk9iamVjdFJlZmVyZW5jZUZpZWxkOiBGaWVsZERlZiA9IG51bGw7XHJcbiAgU291cmNlVGFibGVSZWZlcmVuY2U6IE9iamVjdFJlZmVyZW5jZSA9IG51bGw7XHJcbiAgQ2xpcEJvYXJkRGF0YUV4aXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIERhdGFUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIEtleVN0cm9rZU9uOiBib29sZWFuID0gZmFsc2U7IC8vIHRydWUgaWYgdGhlIHVzZXIgcHJlc3NlZCBhIGtleVxyXG4gIE1vZGlmaWVkQnlVc2VyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgVmFsdWU6IGFueSA9IG51bGw7XHJcbiAgSXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZm9yY2VSZWZyZXNoIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzTW9kYWwgOiBib29sZWFuOyAvL2FwcGxpY2FibGUgZm9yIHN1YmZvcm0sIGlmIHN1YmZvcm0gaXMgTW9kYWxcclxuXHJcbiAgcHJvdGVjdGVkIHNldCBGb3JtKHZhbHVlOiBNZ0Zvcm1CYXNlKSB7XHJcbiAgICB0aGlzLl9mb3JtID0gdmFsdWU7XHJcbiAgICB0aGlzLkd1aU1nRm9ybSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zvcm07XHJcbiAgfVxyXG5cclxuICBnZXQgSWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIGdldCBDb250cm9sSXNuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbElzbjtcclxuICB9XHJcblxyXG4gIFJlZnJlc2hPblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSwgaWYgdGhlIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWQgb24gYmVjb21lIHZpc2libGVcclxuICBJbkNvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBWYWxpZGF0ZUNvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcm9tcHRIZWxwOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLyB0aGUgcHJvbXB0IGhlbHAgdGV4dCBhc3NpZ25lZCB0byBjb250cm9sXHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU/OiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm0/OiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sPzogbnVtYmVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMSh0eXBlLCBwYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2wpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbGlua2VkQ29udHJvbHMgPSBuZXcgTGlzdDxNZ0NvbnRyb2xCYXNlPigpO1xyXG4gICAgdGhpcy5EYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMSh0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLmluaXRSZWZlcmVuY2VzKHBhcmVudE1nRm9ybSk7XHJcbiAgICB0aGlzLlR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5fY29udGFpbmVyRGl0SWR4ID0gcGFyZW50Q29udHJvbDtcclxuICAgIHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCA9IHBhcmVudENvbnRyb2w7XHJcbiAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuICAgIHRoaXMuY3JlYXRlQXJyYXlzKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGdldCBVbmlxdWVOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRhc2tUYWcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm0uZ2V0VGFzaygpLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBjaGVja0lmRXhpc3RQcm9wKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBwcm9wQnlJZDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGV4aXN0ID0gKHByb3BCeUlkICE9PSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBleGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgSWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBnZXRQcm9wKHByb3BJZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsICdDJywgdGhpcyk7XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IHRoZW4gY3JlYXRlIGEgbmV3IHByb3BlcnR5IGFuZCBnaXZlIGl0IHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgLy8gaW4gYWRkaXRpb24gYWRkIHRoaXMgcHJvcGVydHkgdG8gdGhlIHByb3BlcnRpZXMgdGFibGVcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5fcHJvcFRhYi5hZGRQcm9wKHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZm9ybSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgaXMgZmlyc3QgcmVmcmVzaFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVVuaWNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhbHdheXNFdmFsdWF0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwid2FzRXZhbHVhdGVkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV2YWx1YXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlciwgY29udGVudFR5cGVVbmljb2RlOiBib29sZWFuLCByZXNDZWxsVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgYWx3YXlzRXZhbHVhdGU6IGJvb2xlYW4sIHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5FdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQsIHJlc1R5cGUsIGxlbmd0aCwgY29udGVudFR5cGVVbmljb2RlLCByZXNDZWxsVHlwZSwgYWx3YXlzRXZhbHVhdGUsIHdhc0V2YWx1YXRlZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogU3RvcmFnZUF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2wgdGhhdCBhbHJlYWR5IHdhcyBjb21wdXRlZFxyXG4gIC8vLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjcmVhdGUgYSBwcm9wZXJ0eSBpZiBpdCBpc24ndCBleGlzdC5cclxuICAvLy8gTWF5IHdlIG5lZWQgdG8gY3JlYXRlIGEgcHJvcGVydHkgYW5kIHVzZSBpdHMgZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gSW4gUGhhc2UgMiBpbiBSZWZyZXNoUHJvcGVydGllcyBtZXRob2Qgd2UnbGwgY3JlYXRlIGFuZCBjb21wdXRlIHByb3BlcnRpZXMsXHJcbiAgLy8vIHBlcmhhcHMgd2UgbmVlZCBjcmVhdGUgYWxsIHByb3BlcnRpZXMgbm90IG9ubHkgdGhvc2UgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gZGVmYXVsdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbml0aWFsaXppbmcgb2YgaW5uZXIgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj5yZWZlcmVuY2UgdG8gdGhlIHRhc2sgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdFJlZmVyZW5jZXMobWdGb3JtOiBNZ0Zvcm1CYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLkZvcm0gPSBtZ0Zvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW4gdGhlIGZpcnN0IHRpbWUgdGhhdCB3ZSByZWZyZXNoIHRoZSBjb250cm9sIG5lZWQgdG8gY3JlYXRlIGFycmF5c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZUNyZWF0ZUFycmF5c1wiPmNyZWF0ZSBhcnJheXMgaW4gYW55IGNhc2U8L3BhcmFtPlxyXG4gIGNyZWF0ZUFycmF5cyhmb3JjZUNyZWF0ZUFycmF5czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMgfHwgZm9yY2VDcmVhdGVBcnJheXMpIHtcclxuXHJcbiAgICAgIC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIGFsd2F5cyBpbml0aWFsaXplIERDIHRhYmxlIHNpbmNlIHdlIHVzZSBpdCB0byBtZXJnZSBjaG9pY2VzIGZyb20gdGhlXHJcbiAgICAgIC8vIHByb3AgbGlzdCB3aXRoIGNob2ljZXMgZnJvbSB0aGUgREFUQSBDT05UUk9MLlxyXG4gICAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICAgIHRoaXMuX2RjVGFibGVSZWZzID0gbmV3IExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzID0gbmV3IExpc3QoKTtcclxuXHJcbiAgICAgIC8vIFRoZSBwcm9wZXJ0eSBQUk9QX1NFVF9SRUFEX09OTFkgaXMgc2V0IG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBCeSBkZWZhdWx0XHJcbiAgICAgIC8vIHRoaXMgcHJvcGVydHkgaXMgZmFsc2UsIHNvIHdlIGRvIG5vdCBzZXQgaXQuXHJcbiAgICAgIC8vIEJ1dCBmb3IgdGhlIHBoYW50b20gdGFzayBpZiB0aGlzIHByb3BlcnR5IHdhcyB0cnVlLCBhbmQgd2UgZXhpdCB0aGUgcGhhbnRvbSBhbmQgYWdhaW4gZW50ZXIgaW50b1xyXG4gICAgICAvLyB0aGlzIHBoYW50b20gdGhlIHByb3BlcnR5IGJlY29tZXMgZmFsc2UuXHJcbiAgICAgIC8vIFNvIHdlIG5lZWQgdG8gc2F2ZSB0aGUgcHJldmlvdXMgX2N1cnJSZWFkT25seSB2YWx1ZSBmb3IgdGhlIHBoYW50b20gdGFzay5cclxuICAgICAgaWYgKCFmb3JjZUNyZWF0ZUFycmF5cykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWFkT25seSA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY2hvaWNlRGlzcHMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxpbmtzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTnVtcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGxzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0ID0gbmV3IExpc3QoKTtcclxuICAgICAgaWYgKCF0aGlzLklzUmVwZWF0YWJsZSAmJiAhc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJyYXlzKDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXRzIHRoZSBmb2N1cyBvbiB0aGUgY29udHJvbCBhbmQgcmVmcmVzaGVzIHByb21wdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj5Db250cm9sIHRvIGhhdmUgZm9jdXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj5saW5lIG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVmcmVzaFByb21wdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYWN0aXZhdGVGb3JtXCI+d2hldGhlciB0byBhY3RpdmF0ZSBhIGZvcm0gYWZ0ZXIgc2V0Zm9jdXMgb3Igbm90PC9wYXJhbT5cclxuICBhc3luYyBTZXRGb2N1cyhjdHJsOiBNZ0NvbnRyb2xCYXNlLCBsaW5lOiBudW1iZXIsIGFjdGl2YXRlRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSwgY3RybCwgbGluZSwgYWN0aXZhdGVGb3JtKTtcclxuICB9XHJcblxyXG4gIEluc2VydEFycmF5cyhpZHg6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcblxyXG4gICAgdGhpcy5fY3VyclJlYWRPbmx5Lkluc2VydFJhbmdlKG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QuSW5zZXJ0UmFuZ2UoIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlTnVtcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKVxyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX3Byb3BUYWIuSW5zZXJ0UHJldlZhbHVlQXJyYXkoIGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgYXJyYXkncyBzaXplIGFjY29yZGluZyB0byB0aGUgbmV3U2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVBcnJheXMobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY3VyclJlYWRPbmx5LlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZU51bXMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgIHRoaXMuX2RjVGFibGVSZWZzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcm9wVGFiLnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlUHJldlZhbEFycmF5cyhuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb3BUYWIudXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIHBhcnNlIGlucHV0IHN0cmluZyBhbmQgZmlsbCBpbm5lciBkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj50byBwYXJlbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXRpZHhcIj5udW1iZXIgb2YgdGhlIENvbnRyb2wgaW4gQ29udHJvbCBUYWJsZTwvcGFyYW0+XHJcbiAgZmlsbERhdGEobWdGb3JtOiBNZ0Zvcm1CYXNlLCBkaXRJZHg6IG51bWJlciwgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkZvcm0gPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5pbml0UmVmZXJlbmNlcyhtZ0Zvcm0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGl0SWR4ID0gZGl0SWR4O1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGRhdGF0eXBlIGlzIEJMT0IsIGl0cyBwaWN0dXJlIHdvdWxkIGJlIGJsYW5rLiBCdXQgYWZ0ZXIgdmVyc2lvbiAjOTdcclxuICAgIC8vIG9mIEFwcFNlcmlhbGl6ZXIuY3MgKGNoYW5nZWQgZm9yICM0ODU3MjIpLCBibGFuayBwaWN0dXJlIGlzIG5vdCBzZXJpYWxpemVkLlxyXG4gICAgLy8gU28sIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgdG8gYmxhbmsgaGVyZS5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgdGhpcy5fcGljU3RyID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fcGljU3RyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLkRhdGFUeXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgIHRoaXMuc2V0UElDKHRoaXMuX3BpY1N0cik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0U6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OOlxyXG4gICAgICAgICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSlcclxuICAgICAgICAgICAgdGhpcy5EYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0dST1VQOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfU0VUOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTlRBSU5FUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJTkU6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBDb250cm9sLmZpbGxEYXRhKCk6IG1pc3NpbmcgZGF0YXR5cGUgb3IgcGljdHVyZSBzdHJpbmcgZm9yIGNvbnRyb2w6IHswfVwiLCB0aGlzLk5hbWUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgdGhpcy5Gb3JtLnNldFRhYmxlQ3RybCh0aGlzKTtcclxuICAgIH1cclxuICAgIHRoaXMuY3JlYXRlQXJyYXlzKGZhbHNlKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPm5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gaWYgbmV4dCB0YWcgaXMgaW5uZXIgdGFnPC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCkge1xyXG4gICAgICBpZiAodGhpcy5fcHJvcFRhYiA9PT0gbnVsbClcclxuICAgICAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ0MnLCBwYXJzZXIpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKVxyXG4gICAgICB0aGlzLnBhcnNlQXR0cmlidXRlcyhwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIlNvdXJjZVRhYmxlXCIpXHJcbiAgICAgIHRoaXMuUGFyc2VTb3VyY2VUYWJsZShwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIENvbnRyb2wuIEluc2VydCBlbHNlIGlmIHRvIENvbnRyb2wuaW5pdElubmVyT2JqZWN0cyBmb3IgezB9XCIsIGZvdW5kVGFnTmFtZSkpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFBhcnNlU291cmNlVGFibGUocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgIGxldCBvYmpSZWZTdHI6IHN0cmluZyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICBsZXQgc291cmNlVGFibGVSZWZlcmVuY2U6IE9iamVjdFJlZmVyZW5jZSA9IE9iamVjdFJlZmVyZW5jZS5Gcm9tWE1MKG9ialJlZlN0ci50cmltKCkpO1xyXG5cclxuICAgIHRoaXMuU291cmNlVGFibGVSZWZlcmVuY2UgPSBzb3VyY2VUYWJsZVJlZmVyZW5jZTtcclxuICAgIC8vIFNraXAgdGhlIGNsb3NpbmcgPC9wcm9wPiB0YWdcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbnRyb2wgZnJvbSB0aGUgWE1MXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHBhcnNlQXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihcIj5cIiwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcblxyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTC5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pLyonXCInKi87XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSA9IGkgKyAyKSB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGkgKyAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5TZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZVN0cik7XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgMSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIENvbnRyb2wuRmlsbE5hbWUoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHRoZSBjb250cm9sIGF0dHJpYnV0ZXMgaW4gcGFyc2luZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVFlQRTpcclxuICAgICAgICB0aGlzLlR5cGUgPSB2YWx1ZVN0clswXSBhcyBNZ0NvbnRyb2xUeXBlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0RBVEFfQ1RSTDpcclxuICAgICAgICB0aGlzLl9kYXRhQ3RybCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9MSU5LRURfUEFSRU5UOlxyXG4gICAgICAgIHRoaXMuc2V0TGlua2VkUGFyZW50SWR4KFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9DT05UQUlORVI6XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXIoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgIHRoaXMuX2lkID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVFJPTF9JU046XHJcbiAgICAgICAgdGhpcy5fY29udHJvbElzbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX01PREFMOlxyXG4gICAgICAgIHRoaXMuX2lzTW9kYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVFJPTF9aX09SREVSOlxyXG4gICAgICAgIC8vVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfSE9SX0FMSUdNRU5UX0lTX0lOSEVSSVRFRDpcclxuICAgICAgICAvL1RPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNUYWdQcm9jZXNzZWQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIGltYWdlIG9uIHRoZSBjb250cm9sIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWxlTmFtZVwiPjwvcGFyYW0+XHJcbiAgc2V0SW1hZ2UoKTogdm9pZCB7XHJcbiAgICBsZXQgbmV3VmFsOiBzdHJpbmcgPSB0aGlzLlZhbHVlO1xyXG4gICAgaWYgKG5ld1ZhbCA9PT0gbnVsbCB8fCB0aGlzLklzTnVsbCkge1xyXG4gICAgICBuZXdWYWwgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikge1xyXG4gICAgICAvLyBUT0RPIC0gY2hlY2sgaWYgc2hvdWxkIGJlIHN1cHBvcnRlZCAuXHJcbiAgICAgIC8vIENvbW1hbmRzLmFkZEFzeW5jKENvbW1hbmRUeXBlLlBST1BfU0VUX0lNQUdFX0RBVEEsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBCbG9iVHlwZS5nZXRCeXRlcyhuZXdWYWwpLCBwcm9wLmdldFZhbHVlSW50KCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0SW1hZ2VXaXRoRmlsZU5hbWUobmV3VmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEltYWdlV2l0aEZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChmaWxlTmFtZSA9PT0gbnVsbCkge1xyXG4gICAgICBmaWxlTmFtZSA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBmaWxlTmFtZSA9IEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZShmaWxlTmFtZSk7XHJcblxyXG4gICAgaWYgKCFNaXNjLklzV2ViVXJsKGZpbGVOYW1lKSlcclxuICAgICAgZmlsZU5hbWUgPSBcIi4vYXNzZXRzL2ltYWdlcy9cIiArIGZpbGVOYW1lO1xyXG5cclxuICAgIGlmICh0aGlzLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfU1RZTEUsIHRoaXMsIDAsIE1hZ2ljUHJvcGVydGllcy5JbWFnZUZpbGUsIGZpbGVOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5JbWFnZSwgZmlsZU5hbWUpO1xyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGZpbGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIGxheW91dCBvbmx5IGlmIHRoZSByYWRpbyBpcyBub3Qgb24gdGFibGUuIGZvciB0YWJsZSwgaXQgaXMgZG9uZVxyXG4gICAgLy8gZnJvbSBMZ1JhZGlvQ29udGFpbmVyLnNldFNwZWNpZmljQ29udHJvbFByb3BlcnRpZXMoKS5cclxuXHJcbiAgICAvLyBpZiAoc3VwZXIuaXNSYWRpbygpICYmICF0aGlzLklzUmVwZWF0YWJsZSkge1xyXG4gICAgLy8gICBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5FWEVDVVRFX0xBWU9VVCwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGZhbHNlKTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBjb250YWluZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29udGFpbmVySWR4XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldENvbnRhaW5lcihjb250YWluZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29udGFpbmVyRGl0SWR4ID0gY29udGFpbmVySWR4O1xyXG4gICAgbGV0IGNvbnRhaW5lcjogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICBjb250YWluZXIgPSB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9jb250YWluZXJEaXRJZHgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb250YWluZXIgIT09IG51bGwgJiYgY29udGFpbmVyLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudFRhYmxlID0gY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jc1JlcGVhdGFibGUgPSAodGhpcy5fcGFyZW50VGFibGUgIT09IG51bGwgJiYgIXN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG5hbWUgb2YgdGhlIENvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIC8vIGlmICh0aGlzLmlzUmVwZWF0YWJsZSgpKSB7XHJcbiAgICAvLyAgIHJldHVybiBzdXBlci5nZXROYW1lKHRoaXMuRm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGlua2VkQ29udHJvbHMoKTogTGlzdDxNZ0NvbnRyb2xCYXNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGlua2VkQ29udHJvbHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhlIGNvbnRyb2wgaXMgcmVwZWF0YWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUmVwZWF0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLklzUmVwZWF0YWJsZTtcclxuICB9XHJcblxyXG4gIElzTW9kYWwoKSA6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybnMgY3VycmVudCBkaXNwbGF5IGxpbmUgb2YgY29udHJvbDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1c2VMaW5lRm9ySXRlbXNcIj5pZiB0cnVlLCB1c2UgY3VycmVudCBsaW5lIGZvciB0cmVlPC9wYXJhbT5cclxuICBnZXREaXNwbGF5TGluZSh1c2VMaW5lRm9ySXRlbXM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5Jc1JlcGVhdGFibGUgfHwgKHVzZUxpbmVGb3JJdGVtcyAmJiBzdXBlci5pc1RhYmxlQ29udHJvbCgpKSkge1xyXG4gICAgICBsaW5lID0gdGhpcy5Gb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIHZpc2liaWxpdHkgY29uc2lkZXJpbmcgcGFyZW50IHZpc2liaWxpdHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgdHJ1ZSk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuaXNQYXJlbnRQcm9wVmFsdWUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBlbmFibGVkIGNvbnNpZGVyaW5nIHBhcmVudCBlbmFibGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRyb2wgaXMgbW9kaWZpYWJsZSBhbmQgdGhlIHRhc2sgbW9kZSBpcyBub3QgcXVlcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTW9kaWZpYWJsZSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgbW9kaWZpYWJsZTogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZJQUJMRSwgdHJ1ZSk7XHJcbiAgICBsZXQgdGFza0luUXVlcnk6IGJvb2xlYW4gPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZO1xyXG4gICAgbGV0IG1vZGlmeUluUXVlcnk6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWSwgZmFsc2UpO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBtb2RpZmlhYmxlICYmIChtb2RpZnlJblF1ZXJ5IHx8ICF0YXNrSW5RdWVyeSk7XHJcbiAgICBpZiAocmVzdWx0ICYmIHRoaXMuX2ZpZWxkICE9IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gKHRoaXMuX2ZpZWxkLkRiTW9kaWZpYWJsZSB8fCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGRjIHZhbHVlcyBvZiB0aGlzIGRhdGEgY29udHJvbCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGNWYWxzKCk6IERjVmFsdWVzIHtcclxuICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2RjVmFsSWQgPT09IEVNUFRZX0RDUkVGKSB7XHJcbiAgICAgIGRjdiA9ICgodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBkYXRhVmlldy5nZXRFbXB0eUNob2ljZUZvclZlY3RvcnMoKSA6IGRhdGFWaWV3LmdldEVtcHR5Q2hvaWNlKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9kY1ZhbElkID4gLTEpIHtcclxuICAgICAgICBkY3YgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRjdjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN1cnJlbnQgaXNOdWxsIGFjY29yZGluZyB0byB0aGUgY29udHJvbCdzIGN1cnJlbnQgbGluZSBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIFByZXZJc051bGwgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0UHJldklzTnVsbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IGN1cnJPYmo6IGFueSA9IHRoaXMuX3ByZXZJc051bGxzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgbGV0IGN1cnI6IGJvb2xlYW47XHJcbiAgICBpZiAoY3Vyck9iaiA9PT0gbnVsbCkge1xyXG4gICAgICBjdXJyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKGxpbmUsIGN1cnIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN1cnIgPSA8Ym9vbGVhbj5jdXJyT2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcHJldklzTnVsbCB2YWx1ZSBvZiB0aGUgcHJldklzTnVsbCBhcnJheVxyXG4gIC8vLyAgIHRoZSBuZXdWYWx1ZSBjYW4gYmUgTlVMTCBvciBib29sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPlxyXG4gIHNldFByZXZJc051bGwobmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSksIG5ld1ZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+PC9wYXJhbT5cclxuICBzZXRQSUMocGljU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBmb3IgcHVzaCBidXR0b24sIHRyYW5zbGF0ZSB0aGUgZm9ybWF0LlxyXG4gICAgaWYgKHN1cGVyLmlzQnV0dG9uKCkpIHtcclxuICAgICAgdGhpcy5fcGljU3RyID0gKHN1cGVyLklzSW1hZ2VCdXR0b24oKSA/IFwiXCIgKyBYTUxDb25zdGFudHMuRklMRV9OQU1FX1NJWkUudG9TdHJpbmcoKSA6IEV2ZW50cy5UcmFuc2xhdGUocGljU3RyKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fcGljU3RyID0gcGljU3RyO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGljID0gbmV3IFBJQyh0aGlzLl9waWNTdHIsIHRoaXMuRGF0YVR5cGUsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9kYXRhQ3RybCAmJiB0aGlzLl9waWNTdHIuaW5kZXhPZignSCcpID4gLTEpIHtcclxuICAgICAgdGhpcy5fcGljLnNldEhlYnJldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcGljdHVyZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBQSUMgcmVmZXJlbmNlPC9yZXR1cm5zPlxyXG4gIGdldFBJQygpOiBQSUMge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BpYztcclxuICB9XHJcblxyXG5cclxuLy8vIDxyZXR1cm5zPiB0aGUgcGFyZW50IG9mIHRoZSBjb250cm9sIGNhbiBiZSBUYWJsZVxcVGFiXFxDaG9pY2UgY29udHJvbFxcRm9ybTwvcmV0dXJucz5cclxuICBnZXRQYXJlbnQoKTogYW55IHtcclxuICAgIGxldCByZXRQYXJlbnQ6IGFueSA9IHRoaXMuRm9ybTtcclxuICAgIGlmICh0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xKSB7XHJcbiAgICAgIHJldFBhcmVudCA9IHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2NvbnRhaW5lckRpdElkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgIHJldFBhcmVudCA9IHRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0UGFyZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpZWxkIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGaWVsZCgpOiBHdWlGaWVsZEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFNldCB0aGUgZmllbGQgb2YgdGhlIGNvbnRyb2wgYnkgdGhlIGZpZWxkIG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmaWVsZFwiPjwvcGFyYW0+XHJcbiAgc2V0RmllbGQoZmllbGRPckZpZWxkU3RySUQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGZpZWxkT3JGaWVsZFN0cklEID09PSBudWxsIHx8IGZpZWxkT3JGaWVsZFN0cklEIGluc3RhbmNlb2YgR3VpRmllbGRCYXNlKSB7XHJcbiAgICAgIHRoaXMuc2V0RmllbGRfMChmaWVsZE9yRmllbGRTdHJJRCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0RmllbGRfMShmaWVsZE9yRmllbGRTdHJJRCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWVsZF8wKGZpZWxkOiBHdWlGaWVsZEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpZWxkID0gZmllbGQ7XHJcbiAgICBpZiAoZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmllbGQuU2V0Q29udHJvbCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sIGJ5IGEgc3RyaW5nIGZpZWxkIGlkZW50aWZpZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj50aGUgZmllbGQgaWRlbnRpZmllcjogXCJwYXJlbnRJZCxmaWVsZElkeFwiL3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0RmllbGRfMShmaWVsZFN0cklEOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCByZXR1cm5GaWVsZDogR3VpRmllbGRCYXNlID0gdGhpcy5nZXRGaWVsZEJ5VmFsdWVTdHIoZmllbGRTdHJJRCk7XHJcbiAgICBpZiAocmV0dXJuRmllbGQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmllbGQgPSByZXR1cm5GaWVsZDtcclxuICAgICAgdGhpcy5fZmllbGQuU2V0Q29udHJvbCh0aGlzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gQ29udHJvbC5zZXRGaWVsZCgpOiBpbGxlZ2FsIGZpZWxkIGlkZW50aWZpZXI6IFwiICsgZmllbGRTdHJJRCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBwaWN0dXJlIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1hdFwiPnRoZSBmb3JtYXQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV4cElkXCI+YW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybWF0PC9wYXJhbT5cclxuICBzZXRQaWNTdHIoZm9ybWF0OiBzdHJpbmcsIGV4cElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3BpY1N0ciA9IGZvcm1hdDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgdGhpcy5fcGljRXhwRXhpc3RzID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSByYW5nZSBvZiB0aGUgY29udHJvbCBhbmQgY2xlYXJzIHRoZSBtYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1JhbmdlXCI+aXMgdGhlIG5ldyByYW5nZTwvcGFyYW0+XHJcbiAgc2V0UmFuZ2UobmV3UmFuZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmFuZ2UgPSBuZXdSYW5nZTtcclxuICAgIHRoaXMuX3ZkID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXhwSWRcIj5hIHJlZmVyZW5jZSB0byB0aGUgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgc2V0VmFsRXhwKGV4cElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZhbEV4cElkID0gZXhwSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGNvcHkgb2YgdmFsaWRhdGlvbiBkZXRhaWxzIHdpdGggbmV3ICYgb2xkIHZhbHVlIHdpdGhvdXQgY2hhbmdpbmcgcmVhbCB2YWxpZGF0aW9uIGRldGFpbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkVmFsXCI+dmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsXCI+dmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIGJ1aWxkQ29weVBpY3R1cmUob2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkgfHwgc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGNvcHlWRDogVmFsaWRhdGlvbkRldGFpbHMgPSB0aGlzLmdldENvcHlPZlZEKCk7XHJcbiAgICAgIGNvcHlWRC5zZXRWYWx1ZShuZXdWYWwpO1xyXG4gICAgICBjb3B5VkQuc2V0T2xkVmFsdWUob2xkVmFsKTtcclxuICAgICAgcmV0dXJuIGNvcHlWRDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBjb3B5IG9mIHZhbGlkYXRpb24gZGV0YWlscywgd2l0aG91dCBpbmZsdWVuY2UgdG8gdGhlIHJlYWwgdmFsaWRhdGlvbiBkZXRhaWxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldENvcHlPZlZEKCk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIGxldCByZXN1bHQ6IFZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgaWYgKHRoaXMuX3ZkID09PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uRGV0YWlscyh0aGlzLlZhbHVlLCB0aGlzLlZhbHVlLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0aGlzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHModGhpcy5fdmQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSYW5nZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9yYW5nZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmFuZ2VkIHZhbHVlIGZvciBpbnB1dCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmFuZ2VkVmFsdWUobmV3VmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICB2ZCA9IHRoaXMuYnVpbGRDb3B5UGljdHVyZSh0aGlzLlZhbHVlLCBuZXdWYWwpO1xyXG4gICAgdmQuZXZhbHVhdGUoKTtcclxuXHJcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRzIHZhbHVlIHdhcyB3cm9uZ1xyXG4gICAgbGV0IHZhbDogYW55ICA9IHZkLmdldERpc3BWYWx1ZSgpXHJcbiAgICByZXR1cm4gKHZhbC50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB2YWxpZGF0ZSB1c2VyIGlucHV0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICB2YWxpZGF0ZShuZXdWYWw6IGFueSk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHZkOiBWYWxpZGF0aW9uRGV0YWlscztcclxuICAgIGxldCBtb2RpZmllZDogYm9vbGVhbiA9IHRoaXMuTW9kaWZpZWRCeVVzZXI7XHJcbiAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTtcclxuICAgIHZkID0gdGhpcy5idWlsZENvcHlQaWN0dXJlKHRoaXMuVmFsdWUsIG5ld1ZhbCk7XHJcbiAgICB2ZC5ldmFsdWF0ZSgpO1xyXG4gICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IG1vZGlmaWVkO1xyXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcyB2YWx1ZSB3YXMgd3JvbmdcclxuICAgIGlmICh2ZC5WYWxpZGF0aW9uRmFpbGVkKVxyXG4gICAgICByZXR1cm4gdmQuRXJyb3JNZXNzYWdlO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RmllbGRCeVZhbHVlU3RyKHZhbHVlU3RyOiBzdHJpbmcpOiBHdWlGaWVsZEJhc2Uge1xyXG5cclxuICAgIGxldCByZWZQYXJlbnQ6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPih0aGlzLnBhcmVudCk7XHJcbiAgICBsZXQgcmVmVmVlSW5keDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KHRoaXMudmVlSW5keCk7XHJcbiAgICBsZXQgcmV0OiBHdWlGaWVsZEJhc2UgPSA8R3VpRmllbGRCYXNlPnRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHIsIHJlZlBhcmVudCwgcmVmVmVlSW5keCk7XHJcbiAgICB0aGlzLnBhcmVudCA9IHJlZlBhcmVudC52YWx1ZTtcclxuICAgIHRoaXMudmVlSW5keCA9IHJlZlZlZUluZHgudmFsdWU7XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBoYXMgY29udGFpbmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGhhc0NvbnRhaW5lcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHMgbGF5ZXIgb2YgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRMYXllcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuTGF5ZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZXMgdGhlIHBpYyB1c2luZyB0aGUgcmVzdWx0IG9mIHRoZSBmb3JtYXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNFeHBSZXN1bHRcIj50aGUgcmVzdWx0IG9mIHRoZSBmb3JtYXQgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBQSUMgcmVmZXJlbmNlIDwvcmV0dXJucz5cclxuICBjb21wdXRlUElDKHBpY0V4cFJlc3VsdDogc3RyaW5nKTogUElDIHtcclxuICAgIC8vIGZvciBwdXNoIGJ1dHRvbiwgdHJhbnNsYXRlIHRoZSBmb3JtYXQuXHJcbiAgICBsZXQgcGljUmVzdWx0OiBzdHJpbmcgPSAocGljRXhwUmVzdWx0ICE9PSBudWxsICYmIHN1cGVyLmlzQnV0dG9uKCkpID8gRXZlbnRzLlRyYW5zbGF0ZShwaWNFeHBSZXN1bHQpIDogcGljRXhwUmVzdWx0O1xyXG5cclxuICAgIC8vIGNvbnN0cnVjdCBhIG5ldyBwaWN0dXJlIG9ubHkgaWYgdGhlIGV4cHJlc3Npb24gcmVzdWx0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBwcmV2aW91cyByZXN1bHRcclxuICAgIGlmICh0aGlzLl9wcmV2UGljRXhwUmVzdWx0ID09PSBudWxsIHx8ICEodGhpcy5fcHJldlBpY0V4cFJlc3VsdCA9PT0gcGljUmVzdWx0KSkge1xyXG4gICAgICB0aGlzLl9waWMgPSBuZXcgUElDKHBpY1Jlc3VsdCwgdGhpcy5EYXRhVHlwZSwgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgIHRoaXMuX3ByZXZQaWNFeHBSZXN1bHQgPSBwaWNSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fcGljO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXRzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaG9pY2UgaW4gdGhlIGNob2ljZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+aW5kZXggb2YgdGhlIGN1cnJlbnQgY2hvaWNlPC9yZXR1cm5zPlxyXG4gIGdldEN1cnJlbnRJbmRleE9mQ2hvaWNlKCk6IG51bWJlcltdIHtcclxuICAgIGxldCBzZWxlY3RlZEluZGljZTogbnVtYmVyW10gPSBbLTFdO1xyXG5cclxuICAgIGxldCB2YWw6IHN0cmluZyA9IHRoaXMuVmFsdWU7XHJcblxyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkodmFsKSkge1xyXG4gICAgICBsZXQgYXJyYXkyOiBzdHJpbmdbXSA9IHZhbC5zcGxpdCgnLCcvKicsJyovKTtcclxuICAgICAgc2VsZWN0ZWRJbmRpY2UgPSBuZXcgQXJyYXk8bnVtYmVyPihhcnJheTIubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGFycmF5Mi5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICAgIGxldCBudW06IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoYXJyYXkyW2lDdHJdKTtcclxuICAgICAgICBzZWxlY3RlZEluZGljZVtpQ3RyXSA9ICgobnVtID49IDApID8gbnVtIDogLTEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRJbmRpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpcyBtdWx0aSBzZWxlY3Rpb24gbGlzdCBib3ggZWxzZSBmYWxzZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc3VwZXIuaXNMaXN0Qm94KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiBjb250cm9sIHBpY3R1cmUgaXMgZGF0ZSBvciB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzRGF0ZVRpbWVQaWN0dXJlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BpYy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9waWMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGhpcyBjb250cm9sIHN1cHBvcnQgZGF0YSBzb3VyY2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU3VwcG9ydHNEYXRhU291cmNlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpIHx8IHN1cGVyLmlzUmFkaW8oKSB8fCB0aGlzLkhhc0F1dG9jb21wbGV0ZSgpIDtcclxuICB9XHJcblxyXG4gIEhhc0F1dG9jb21wbGV0ZSgpIHtcclxuICAgIGlmIChzdXBlci5pc1RleHRDb250cm9sKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19DT01QTEVURV9NT0RFX1dDKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBhcnJheSBvZiBpbmRpY2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBzcGVjaWZpYyBsaW5rIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIHJlcXVlc3RlZCB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc051bGxcIj50cnVlIGlmIG1nVmFsIHJlcHJlc2VudHMgYSBudWxsIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGFycmF5IG9mIGluZGljZTwvcmV0dXJucz5cclxuICBhc3luYyBnZXRJbmRleE9mQ2hvaWNlKG1nVmFsOiBzdHJpbmcsIGxpbmU6IG51bWJlciwgaXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTxudW1iZXJbXT4ge1xyXG5cclxuICAgIC8vIGlmIHRoZSBjb250cm9sIGlzIGxpc3Rib3ggd2l0aCBzaW5nbGUgc2VsZWN0aW9uIG1vZGUsIGFuZCB0aGUgdmFsdWUgaXMgY29tbWEgc2VwYXJhdGVkLCB0aGVuIHdlIHNob3VsZCBub3Qgc3BsaXQgdmFsdWUgb24gY29tbWEuXHJcbiAgICBsZXQgc3BsaXRDb21tYVNlcGVyYXRlZFZhbHM6IGJvb2xlYW4gPSB0aGlzLklzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG5cclxuICAgIGxldCBpc1ZlY3RvclZhbHVlOiBib29sZWFuID0gdGhpcy5nZXRGaWVsZCgpICE9PSBudWxsICYmIHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREY1ZhbHMoKS5nZXRJbmRleE9mKG1nVmFsLCBpc1ZlY3RvclZhbHVlLCBpc051bGwsIHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpLCB0aGlzLl9jaG9pY2VOdW1zLmdldF9JdGVtKGxpbmUpLCBzcGxpdENvbW1hU2VwZXJhdGVkVmFscyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHBhcnNlZCBjb250ZW50IG9mIFBST1BfVFlQRV9ESVNQTEFZX0xJU1Q8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0RGlzcFZhbHMobGluZTogbnVtYmVyLCBleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX29yZ0Nob2ljZURpc3BzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jaG9pY2VEaXNwcy5nZXRfSXRlbShsaW5lKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBlbXB0eUNob2ljZShsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB2YWx1ZTogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigwKTtcclxuICAgIHRoaXMuX2Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZXMgdGhlIGNob2ljZXMgb2YgYSBTRUxFQ1QgY29udHJvbCB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoZSBjb250cm9sJ3MgcHJvcGVydGllcyAoaW4gY29udHJhc3QgdG9cclxuICAvLy8gICB0aGUgb25lcyBvcmlnaW5hdGluZyBmcm9tIHRoZSB1bmRlcmxheWluZyB0YWJsZSBvZiBhIGRhdGEgY29udHJvbClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgY29tcHV0ZUNob2ljZShsaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmcm9tSGVscDogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiXFxcXFxcXFxcIiwgXCJcXFxcLVwiLCBcIlxcXFwsXCJcclxuICAgIF07XHJcbiAgICBsZXQgdG9IZWxwOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJYWFwiLCBcIlhYXCIsIFwiWFhcIlxyXG4gICAgXTtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGFzay5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICBsZXQgY3VyckRjSWQ6IG51bWJlciA9IHRoaXMuZ2V0RGNSZWYoKTtcclxuICAgIGxldCBjaG9pY2VEaXNwU3RyOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGNob2ljZUxpbmtTdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgb3B0aW9uc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCB0cmltVG9MZW5ndGg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGRhdGFUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5EYXRhVHlwZTtcclxuICAgIGxldCBpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIC8vIHJlLWNvbXB1dGUgdmFsdWVzIG9ubHkgaWYgdGhleSBhcmUgbm90IHZhbGlkIG9yIHRoZSBEQyB3YXMgY2hhbmdlZCAoZHVlIHRvSGVscCByZWNvbXB1dGUpXHJcbiAgICAgIGlmICh0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKSA9PT0gbnVsbCB8fCAodGhpcy5pc0RhdGFDdHJsKCkgJiYgY3VyckRjSWQgIT09IHRoaXMuX2RjVmFsSWQpKSB7XHJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgICAgICBkYXRhVHlwZSA9IHRoaXMuZ2V0RmllbGQoKS5nZXRDZWxsc1R5cGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRpc3BWYWxzOiBzdHJpbmdbXSA9IGRjdi5nZXREaXNwVmFscygpO1xyXG4gICAgICAgIGxldCBkaXNwUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9MSVNUKTtcclxuICAgICAgICBsZXQgbGlua1Byb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKTtcclxuICAgICAgICBpZiAoZGlzcFByb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgIGNob2ljZURpc3BTdHIgPSBhd2FpdCBkaXNwUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGlua1Byb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgIGNob2ljZUxpbmtTdHIgPSBhd2FpdCBsaW5rUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hvaWNlTGlua1N0ciA9PT0gbnVsbCB8fCBTdHJVdGlsLnJ0cmltKGNob2ljZUxpbmtTdHIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgY2hvaWNlTGlua1N0ciA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaG9pY2VEaXNwU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlRGlzcFN0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaXNEYXRhQ3RybCgpIHx8IGRpc3BWYWxzID09PSBudWxsIHx8IGRpc3BWYWxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gY2hvaWNlTGlua1N0cjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gKGNob2ljZUxpbmtTdHIgPSBcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaG9pY2VEaXNwU3RyID0gRXZlbnRzLlRyYW5zbGF0ZShjaG9pY2VEaXNwU3RyKTtcclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykge1xyXG4gICAgICAgICAgY2hvaWNlTGlua1N0ciA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShjaG9pY2VMaW5rU3RyLCBcIlxcXFwtXCIsIFwiLVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGhlbHBTdHI6IHN0cmluZyA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShjaG9pY2VMaW5rU3RyLCBmcm9tSGVscCwgdG9IZWxwKTtcclxuICAgICAgICBsZXQgc1Rvazogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGhlbHBTdHIsIFwiLFwiKTtcclxuICAgICAgICBsZXQgbGlua1NpemU6IG51bWJlciA9IChoZWxwU3RyICE9PSBcIlwiKSA/IHNUb2subGVuZ3RoIDogMDtcclxuICAgICAgICBsZXQgaGVscFN0ckRpc3A6IHN0cmluZyA9IFN0clV0aWwuc2VhcmNoQW5kUmVwbGFjZShjaG9pY2VEaXNwU3RyLCBmcm9tSGVscCwgdG9IZWxwKTtcclxuICAgICAgICBzVG9rID0gU3RyVXRpbC50b2tlbml6ZShoZWxwU3RyRGlzcCwgXCIsXCIpO1xyXG4gICAgICAgIGxldCBkaXNwbGF5U2l6ZTogbnVtYmVyID0gKGhlbHBTdHJEaXNwICE9PSBcIlwiKSA/IHNUb2subGVuZ3RoIDogMDtcclxuXHJcbiAgICAgICAgaWYgKGxpbmtTaXplICE9PSBkaXNwbGF5U2l6ZSAmJiBkaXNwbGF5U2l6ZSA+IDApIHtcclxuICAgICAgICAgIGNob2ljZURpc3BTdHIgPSBjaG9pY2VMaW5rU3RyO1xyXG4gICAgICAgICAgaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXIgPSBsaW5rU2l6ZTtcclxuICAgICAgICBsZXQgY2hvaWNlTGluazogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihzaXplKTtcclxuICAgICAgICB0aGlzLl9jaG9pY2VMaW5rcy5zZXRfSXRlbShsaW5lLCBjaG9pY2VMaW5rKTtcclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCBkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgICAgIHRoaXMuX2Nob2ljZU51bXMuc2V0X0l0ZW0obGluZSwgbmV3IEFycmF5PE5VTV9UWVBFPihzaXplKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgZGlzcGxheSB2YWx1ZXNcclxuICAgICAgICBsZXQgb3JnQ2hvaWNlRGlzcDogc3RyaW5nW10gPSBDaG9pY2VVdGlscy5HZXREaXNwbGF5TGlzdEZyb21TdHJpbmcoY2hvaWNlRGlzcFN0ciwgZmFsc2UsIHRydWUsICFpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0KTtcclxuICAgICAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBvcmdDaG9pY2VEaXNwKTtcclxuICAgICAgICBsZXQgY2hvaWNlRGlzcDogc3RyaW5nW10gPSBDaG9pY2VVdGlscy5HZXREaXNwbGF5TGlzdEZyb21TdHJpbmcoY2hvaWNlRGlzcFN0ciwgc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCkgfHwgc3VwZXIuaXNUYWJDb250cm9sKCksIHRydWUsICFpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0KTtcclxuICAgICAgICB0aGlzLl9jaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBjaG9pY2VEaXNwKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRGaWVsZCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0cmltVG9MZW5ndGggPSB0aGlzLmdldEZpZWxkKCkuZ2V0U2l6ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGxldCB0b2tlbjogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICBsZXQgaGVscFRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGxldCB0b2tlbkJ1ZmZlcjogU3RyaW5nQnVpbGRlcjtcclxuICAgICAgICAvLyBBZGQgbGluayB2YWx1ZXMuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgY3VyclBvczogbnVtYmVyID0gMCwgbmV4dFBvcyA9IDA7IGkgPCBzaXplICYmIG9wdGlvbnNWYWxpZDsgaSsrKSB7XHJcbiAgICAgICAgICBuZXh0UG9zID0gY3VyclBvcztcclxuICAgICAgICAgIG5leHRQb3MgPSBoZWxwU3RyLmluZGV4T2YoJywnLCBuZXh0UG9zKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV4dFBvcyA9PT0gY3VyclBvcylcclxuICAgICAgICAgICAgdG9rZW4gPSBoZWxwVG9rZW4gPSBcIlwiO1xyXG4gICAgICAgICAgZWxzZSBpZiAobmV4dFBvcyA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdG9rZW4gPSBjaG9pY2VMaW5rU3RyLnN1YnN0cihjdXJyUG9zKTtcclxuICAgICAgICAgICAgaGVscFRva2VuID0gaGVscFN0ci5zdWJzdHIoY3VyclBvcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdG9rZW4gPSBjaG9pY2VMaW5rU3RyLnN1YnN0cihjdXJyUG9zLCAobmV4dFBvcykgLSAoY3VyclBvcykpO1xyXG4gICAgICAgICAgICBoZWxwVG9rZW4gPSBoZWxwU3RyLnN1YnN0cihjdXJyUG9zLCAobmV4dFBvcykgLSAoY3VyclBvcykpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGN1cnJQb3MgPSBuZXh0UG9zICsgMTtcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk1FTU86XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICAgICAgdG9rZW4gPSBTdHJVdGlsLmx0cmltKHRva2VuKTtcclxuICAgICAgICAgICAgICBoZWxwVG9rZW4gPSBTdHJVdGlsLmx0cmltKGhlbHBUb2tlbik7XHJcbiAgICAgICAgICAgICAgaWYgKGhlbHBUb2tlbi5pbmRleE9mKCdcXFxcJykgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5CdWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdG9rZW5Qb3M6IG51bWJlciA9IDA7IHRva2VuUG9zIDwgaGVscFRva2VuLmxlbmd0aDsgdG9rZW5Qb3MrKylcclxuICAgICAgICAgICAgICAgICAgaWYgKGhlbHBUb2tlblt0b2tlblBvc10gIT09ICdcXFxcJylcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbkJ1ZmZlci5BcHBlbmQodG9rZW5bdG9rZW5Qb3NdKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5Qb3MgPT09IGhlbHBUb2tlbi5sZW5ndGggLSAxKVxyXG4gICAgICAgICAgICAgICAgICAgIHRva2VuQnVmZmVyLkFwcGVuZCgnICcpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5CdWZmZXIuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdG9rZW4gPSBTdHJVdGlsLm1ha2VQcmludGFibGVUb2tlbnModG9rZW4sIFNFUV8yX1NUUik7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25DdHJsKCkgfHwgdGhpcy5pc1RhYkNvbnRyb2woKSlcclxuICAgICAgICAgICAgICAgIHRva2VuID0gQ2hvaWNlVXRpbHMuUmVtb3ZlQWNjbENoYXJGcm9tT3B0aW9ucyhuZXcgU3RyaW5nQnVpbGRlcih0b2tlbikpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBjaG9pY2VMaW5rIHNpemUgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBzaXplIG9mIHRoZSBmaWVsZCwgc28gdHJpbSBpdC5cclxuICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyaW1Ub0xlbmd0aCAhPT0gLTEgJiYgVXRpbFN0ckJ5dGVNb2RlLmxlbkIodG9rZW4pID4gdHJpbVRvTGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICB0b2tlbiA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0b2tlbiwgdHJpbVRvTGVuZ3RoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpbVRvTGVuZ3RoICE9PSAtMSAmJiB0b2tlbi5sZW5ndGggPiB0cmltVG9MZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKDAsIHRyaW1Ub0xlbmd0aCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjaG9pY2VMaW5rW2ldID0gdG9rZW47XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgICAgIGxldCBwaWN0dXJlOiBQSUMgPSBQSUMuYnVpbGRQaWN0dXJlKGRhdGFUeXBlLCB0b2tlbiwgdGFzay5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgICAgICBvcHRpb25zVmFsaWQgPSB0aGlzLm9wdGlvbklzVmFsaWQodG9rZW4pO1xyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRpc3AybWcodG9rZW4udHJpbSgpLCBwaWN0dXJlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRDb21wSWR4KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgICAgICAgICAgKCh0aGlzLl9jaG9pY2VOdW1zLmdldF9JdGVtKGxpbmUpKSlbaV0gPSBuZXcgTlVNX1RZUEUoY2hvaWNlTGlua1tpXSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAgICAgICBjaG9pY2VMaW5rW2ldID0gKDEgLSBpKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb3B0aW9uc1ZhbGlkKVxyXG4gICAgICAgICAgdGhpcy5lbXB0eUNob2ljZShsaW5lKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgb3B0aW9uc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lbXB0eUNob2ljZShsaW5lKTtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfVwiLCBleC5HZXRUeXBlKCksIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9oYXNWYWxpZEl0bUFuZERpc3BWYWwgPSBvcHRpb25zVmFsaWQ7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHRvcG1vc3QgZm9ybSBvZiB0aGUgc3ViZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUb3BNb3N0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUb3BNb3N0Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlIHVybCBvbiBicm93c2VyIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0VXJsKCk6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIDAsIHRoaXMuVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIGluIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNvbnRyb2wgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbFwiPnRoZSBkaXNwbGF5ZWQgdmFsdWUgd2l0aCB0aGUgbWFza2luZyBjaGFyYWN0ZXJzPC9wYXJhbT5cclxuICBhc3luYyBnZXRNZ1ZhbHVlKGRpc3BWYWw6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzQ2hlY2tCb3goKSkge1xyXG4gICAgICBtZ1ZhbCA9IGRpc3BWYWwgPyBcIjFcIiA6IFwiMFwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSB8fCBzdXBlci5pc1JhZGlvKCkpIHtcclxuXHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmIChsaW5lIDwgMClcclxuICAgICAgICAgIGxpbmUgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3BWYWwgPT09IFwibnVtYmVyXCIpXHJcbiAgICAgICAgICBkaXNwVmFsID0gZGlzcFZhbC50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkaXNwVmFsKSlcclxuICAgICAgICAgIGRpc3BWYWwgPSBkaXNwVmFsLmpvaW4oJywnKS50b1N0cmluZygpO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKGRpc3BWYWwgPT09IFwiXCIpIHtcclxuICAgICAgICAgIG1nVmFsID0gZGlzcFZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGF3YWl0IHRoaXMuZ2V0TGlua1ZhbHVlKGRpc3BWYWwsIGxpbmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWdWYWwgPT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBpc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgIC8vIFRoZSBkYXRhIGNvbnRyb2wgd2lsbCBuZXZlciByZXR1cm4gYW4gaWxsZWdhbCB2YWx1ZSBhcyBhIHJlc3VsdCBvZiBhIHVzZXIgc2VsZWN0aW9uXHJcbiAgICAgICAgICAvLyBidXQgYXMgYSByZXN1bHQgb2YgYW4gaW5pdCBleHByZXNzaW9uLCB1cGRhdGUgb3BlcmF0aW9uIG9yIHZhbHVlcyBvZiBkYXRhIGluXHJcbiAgICAgICAgICAvLyB0aGUgcmVjb3JkLiBUaGVyZWZvcmUsIHRoZSBzYW1lIGlsbGVnYWwgdmFsdWUgc2hvdWxkIGJlIHRha2VuIGZyb20gaXRzIHNvdXJjZSxcclxuICAgICAgICAgIC8vIHdoaWNoIGlzIGEgZmllbGQgb3IgYW4gZXhwcmVzc2lvbi4gKEVodWQgMTktanVuLTIwMDEpXHJcbiAgICAgICAgICBsZXQgcmVmTWdWYWw6IFJlZlBhcmFtPHN0cmluZz4gPSBuZXcgUmVmUGFyYW08c3RyaW5nPihtZ1ZhbCk7XHJcbiAgICAgICAgICBsZXQgcmVmSXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbTxib29sZWFuPihpc051bGwpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBtZ1ZhbCA9IHJlZk1nVmFsLnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgYmxvYkNvbnRlbnRUeXBlOiBzdHJpbmcgPSAodGhpcy5fZmllbGQgIT09IG51bGwpID8gdGhpcy5fZmllbGQuZ2V0Q29udGVudFR5cGUoKSA6IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOO1xyXG4gICAgICAgIG1nVmFsID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKGRpc3BWYWwsIHRoaXMuX3BpYywgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgYmxvYkNvbnRlbnRUeXBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1nVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgZm9yIGluZGljZSBwYXNzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZWxlY3RlZEluZGljZVwiPmNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5jb21tYSBzZXBhcmF0ZWQgdmFsdWVzPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldExpbmtWYWx1ZShzZWxlY3RlZEluZGljZTogc3RyaW5nLCBsaW5lOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBOU3RyaW5nLkVtcHR5O1xyXG4gICAgbGV0IHRlbXA6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcblxyXG4gICAgbGV0IGNob2ljZUxpbms6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSk7XHJcblxyXG4gICAgaWYgKGNob2ljZUxpbmsgIT09IG51bGwpIHtcclxuICAgICAgLy8gY29tcHV0ZSBzaXplIG9mIGRpc3BsYXllZCB2YWx1ZXMgYXJyYXlcclxuICAgICAgc2l6ZSA9IGNob2ljZUxpbmsubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IGxpbmtJbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRMaW5rSWR4RnJvbUxheWVyKE1pc2MuR2V0SW50QXJyYXkoc2VsZWN0ZWRJbmRpY2UpKTtcclxuXHJcbiAgICBsZXQgYXJyYXkyOiBudW1iZXJbXSA9IGxpbmtJbmRpY2U7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXkyLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IGFycmF5MltpXTtcclxuICAgICAgaWYgKGlkeCA+PSBzaXplKSB7XHJcbiAgICAgICAgbGV0IGRjVmFsczogRGNWYWx1ZXMgPSB0aGlzLmdldERjVmFscygpO1xyXG4gICAgICAgIHRlbXAucHVzaChkY1ZhbHMuZ2V0TGlua1ZhbHVlKGlkeCAtIHNpemUpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgY2hvaWNlTGluay5sZW5ndGgpIHtcclxuICAgICAgICAgIHRlbXAucHVzaChjaG9pY2VMaW5rW2lkeF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRlbXAucHVzaChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICBsZXQgdmVjdG9yVHlwZTogVmVjdG9yVHlwZSA9IG5ldyBWZWN0b3JUeXBlKHRoaXMuZ2V0RmllbGQoKSk7XHJcbiAgICAgIGZvciAobGV0IGluZHg6IG51bWJlciA9IDA7IGluZHggPCB0ZW1wLmxlbmd0aDsgaW5keCA9IGluZHggKyAxKSB7XHJcbiAgICAgICAgdmVjdG9yVHlwZS5zZXRWZWNDZWxsKGluZHggKyAxLCB0ZW1wLmdldF9JdGVtKGluZHgpLCB0ZW1wLmdldF9JdGVtKGluZHgpID09PSBudWxsKTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSB2ZWN0b3JUeXBlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRlbXAuam9pbihcIixcIik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVtcC5nZXRfSXRlbSgwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGV4dCBvbiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRUZXh0KCk6IHZvaWQge1xyXG4gICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IG1sc1RyYW5zbGF0ZWRWYWx1ZTogYW55ID0gdGhpcy5WYWx1ZTtcclxuICAgIGlmIChzdXBlci5pc0J1dHRvbigpKSB7XHJcbiAgICAgIG1sc1RyYW5zbGF0ZWRWYWx1ZSA9IEV2ZW50cy5UcmFuc2xhdGUodGhpcy5WYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1RleHRDb250cm9sKCkgfHwgdGhpcy5pc0J1dHRvbigpKVxyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgZGlzcGxheUxpbmUsIG1sc1RyYW5zbGF0ZWRWYWx1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgZGlzcGxheUxpbmUsIC8qXCJpbm5lckhUTUxcIiovIEh0bWxQcm9wZXJ0aWVzLlRleHQsIG1sc1RyYW5zbGF0ZWRWYWx1ZSk7XHJcblxyXG4gICAgLy8gQ29tbWFuZHMuYWRkQXN5bmMoQ29tbWFuZFR5cGUuUFJPUF9TRVRfVEVYVCwgdGhpcywgZGlzcGxheUxpbmUsIG1sc1RyYW5zbGF0ZWRWYWx1ZSwgMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcmFkaW8gYnV0dG9uIGNoZWNrZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFkaW9MaW5lXCI+aXMgdGhlIGxpbmUgb2YgdGhlIHJhZGlvIHRoYXQgbmVlZCB0byBiZSBTZXQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0UmFkaW9DaGVja2VkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGluZGV4KTtcclxuICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcblxyXG4gICAgLy8gc2V0IGNvbnRyb2wgdG8gZm9jdXNcclxuICAgIGlmIChpbmRleCAhPT0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfVkFMVUVfSU5UKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29udHJvbFRvRm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldENvbnRyb2xUb0ZvY3VzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmdldEZpZWxkKCkuQ29udHJvbFRvRm9jdXMgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBDaGVja0JveCBWYWx1ZSB0byB0aGUgY2hlY2sgYm94IGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2V0Q2hlY2tCb3hWYWx1ZShsaW5lOiBudW1iZXIsIG1nVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjaGVja1N0YXRlOiBib29sZWFuID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4obWdWYWwpO1xyXG4gICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsIGNoZWNrU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlQ2hhbmdlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hBbmRTZXRJdGVtTGlzdEJ5RGF0YVNvdXJjZShsaW5lOiBudW1iZXIsIHZhbHVlQ2hhbmdlZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpIHtcclxuICAgICAgbGV0IGN1cnJEY0lkOiBudW1iZXIgPSB0aGlzLmdldERjUmVmKCk7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgcmFuZ2Ugd2FzIGNoYW5nZWQgd2UgaGF2ZSB0byByZWNhbGN1bGF0ZSB0aGUgY29ycmVjdCBjaG9pY2Ugb3B0aW9uXHJcbiAgICAgIGlmICh0aGlzLl9yYW5nZUNoYW5nZWQpIHtcclxuICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3JhbmdlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGFDdHJsKCkgJiYgY3VyckRjSWQgIT09IHRoaXMuX2RjVmFsSWQpIHtcclxuXHJcbiAgICAgICAgLy8gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IHNlcnZlciB3cml0ZXMgb3B0aW9uTGlzdCB0byB0aGUgSFRNTC4gTm8gbmVlZCB0byBhcHBseVxyXG4gICAgICAgIC8vIHRoZW1cclxuICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHRpbWUuXHJcbiAgICAgICAgLy8gZm9yY2UgdXBkYXRlIG9mIHRoZSB2YWx1ZSB3aGVuZXZlciB0aGUgc2V0IG9mIG9wdGlvbnMgaXMgcmVwbGFjZWRcclxuICAgICAgICAvLyBpZiAoZm9ybS5mb3JtUmVmcmVzaGVkKCkgfHwgZm9yY2VSZWZyZXNoKVxyXG5cclxuICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnNldERjUmVmKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWVDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgZGNyZWYgZm9yIHRoZSBjdXJyZW50IHRhYmxlIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGNJZFwiPnRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBkY3ZhbHM8L3BhcmFtPlxyXG4gIHNldERjUmVmKGRjSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGNUYWJsZVJlZnMuc2V0X0l0ZW0odGhpcy5nZXREY0xpbmVOdW0oKSwgZGNJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVwbGFjZSB0aGUgaW1hZ2UgbGlzdCBvZiBhbiBidXR0b24gY29udHJvbCB3aXRoIHRoZSBpbWFnZSBhdCB0aGUgZ2l2ZW4gVVJMXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJbWFnZUxpc3QodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVXBkYXRlIGJvb2xlYW4gcHJvcGVydHkoZXg6dmlzaWJsZVxcZW5hYmxlKSBvZiBjb250cm9sIGFuZCBpdCdzIGNoaWxkcmVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnByb3BlcnR5IGlkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPmNvbW1hbmQgdHlwZSB0aGF0IGJlbG9uZyB0byB0aGUgcHJvcCBpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidXBkYXRlVGhpc1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgdXBkYXRlUHJvcGVydHlMb2dpY05lc3RpbmcocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuLCB1cGRhdGVUaGlzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiAodmFsICYmIHRoaXMuaGF2ZVRvQ2hlY2tQYXJlbnRWYWx1ZSgpKSB7XHJcbiAgICAvLyAgdmFsID0gdGhpcy5pc1BhcmVudFByb3BWYWx1ZShwcm9wSWQpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKHVwZGF0ZVRoaXMpIHtcclxuXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRUeXBlID09PSBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFID8gSHRtbFByb3BlcnRpZXMuVmlzaWJsZSA6IEh0bWxQcm9wZXJ0aWVzLkVuYWJsZWQsIHZhbCk7XHJcblxyXG4gICAgfVxyXG4gICAgLy8gdG9kbzogc2hvdWxkIGdvIG92ZXIgb25seSBsaW5rZWQgY29udHJvbHMgLSBub3QgY2hpbGRyZW4gY29udHJvbHMsIG5lZWQgdG8gY2hlY2sgd2l0aCBQTSB0aGlzIGJlaGF2aW9yXHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIHZhbCk7XHJcbiAgfVxyXG5cclxuICBTZXRFbmFibGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuRW5hYmxlZCwgdmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGVzIHZpc2liaWxpdHkgb2YgY29udHJvbHMgbGlua2VkIHRvIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHVwZGF0ZUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZDogbnVtYmVyLCBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUsIHZhbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICghc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICAvLyBpbiB0YWJsZSBhbGwgY2hpbGRyZW4gYXJlIGNvbnRhaW5lZCxcclxuICAgICAgLy8gdGFibGUncyB2aXNpYmlsaXR5XFxlbmFibGUgd2lsbCBhZmZlY3QgdGhlbVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2xpbmtlZENvbnRyb2xzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZDogTWdDb250cm9sQmFzZSA9IHRoaXMuX2xpbmtlZENvbnRyb2xzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIC8vIERlZmVjdCAxMTcyOTQuIERvIG5vdCBjb250aW51ZSBmb3IgdGhlIGZpcnN0IHRpbWUuIEl0IGFmZmVjdHMgb24gdGhlIHBsYWNlbWVudC5cclxuICAgICAgICBpZiAoY2hpbGQuSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgbGV0IGNoaWxkVmFsdWU6IGJvb2xlYW4gPSAoY2hpbGQuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCB0cnVlKSk7XHJcblxyXG4gICAgICAgIGNoaWxkVmFsdWUgPSBjaGlsZFZhbHVlICYmIHZhbDtcclxuXHJcbiAgICAgICAgbGV0IGNoaWxkT25DdXJyZW50TGF5ZXI6IGJvb2xlYW4gPSB0aGlzLmlzQ2hpbGRPbkN1cnJlbnRMYXllcihjaGlsZCk7XHJcblxyXG4gICAgICAgIGlmIChjb21tYW5kVHlwZSA9PT0gQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSkge1xyXG5cclxuICAgICAgICAgIGlmIChjaGlsZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNoaWxkVmFsdWUgPSBjaGlsZE9uQ3VycmVudExheWVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgY2hpbGQudXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgY2hpbGRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdXBlci5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN1YmZvcm1DaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCB2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGhpcyBjb250cm9sIGlzIGRlc2NlbmRhbnQgb2Ygc3BlY2lmaWVkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEZXNjZW5kZW50T2ZDb250cm9sKGNvbnRyb2w6IEd1aU1nQ29udHJvbCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzQ29udGFpbmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKGNvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHBhcmVudDogYW55ID0gdGhpcy5nZXRQYXJlbnQoKTtcclxuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpIHtcclxuICAgICAgICBpZiAocGFyZW50ID09PSBjb250cm9sKSB7XHJcbiAgICAgICAgICBpc0NvbnRhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gSWYgY3VycmVudCBjb250cm9sIGJlbG9uZ3MgdG8gdGFibGUsIHRoZW4gaXQgaXMgYWxzbyBhIGRlc2NlbmRhbnQgb2YgdGhlIGNvbHVtbiBjb250cm9sIHRvXHJcbiAgICAgICAgICAvLyB3aGljaCBpdCBiZWxvbmdzLiBBY2NvcmRpbmcgdG8gb3VyIGhpZXJhcmNoeSwgdGhlIGNvbnRyb2wgaXMgZGlyZWN0IGRlc2NlbmRhbnQgb2YgdGFibGVcclxuICAgICAgICAgIC8vIGNvbnRyb2w7IGhlbmNlLCB3ZSBuZWVkIHRvIGhhbmRsZSBjb2x1bW4gY29udHJvbFxyXG5cclxuICAgICAgICAgIGxldCBwYXJlbnRDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gKChwYXJlbnQgaW5zdGFuY2VvZiBNZ0NvbnRyb2xCYXNlKSA/IDxNZ0NvbnRyb2xCYXNlPnBhcmVudCA6IG51bGwpO1xyXG4gICAgICAgICAgaWYgKGNvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmIHBhcmVudENvbnRyb2wgIT09IG51bGwgJiYgcGFyZW50Q29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiBjb250cm9sLkxheWVyID09PSB0aGlzLkxheWVyKVxyXG4gICAgICAgICAgICBpc0NvbnRhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGlzQ29udGFpbmVkID0gKCg8TWdDb250cm9sQmFzZT5wYXJlbnQpLmlzRGVzY2VuZGVudE9mQ29udHJvbChjb250cm9sKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNDb250YWluZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVXBkYXRlcyB2aXNpYmlsaXR5IG9yIGVuYWJsZSBwcm9wZXJ0eSBvZiBzdWJmb3JtIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPklkIG9mIHZpc2liaWxpdHkgb3IgZW5hYmxlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+dHlwZSBvZiB0aGUgR1VJIGNvbW1hbmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dmFsdWUgZm9yIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgdXBkYXRlU3ViZm9ybUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZDogbnVtYmVyLCBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUsIHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBjaGlsZCdzIGxheWVyIGlzIGVxdWFsIHRvIGN1cnJlbnQgbGF5ZXIgb2YgdGhlIHBhcmVudCwgcmVsYXZhbnQgZm9yIHRhYiBjb250cm9sIGZvciBhbGwgb3RoZXJcclxuICAvLy8gICBjb250cm9scyByZXR1cm5zIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hpbGRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBwYXJlbnQgaXMgbm90IHRhYiBjb250cm9sIG9yIHBhcmVudCBpcyB0YWIgY29udHJvbCB3aXRoIHNhbWUgbGF5ZXI8L3JldHVybnM+XHJcbiAgaXNDaGlsZE9uQ3VycmVudExheWVyKGNoaWxkOiBNZ0NvbnRyb2xCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8vIGNoZWNrIHRoYXQgdGhlIGNvbnRyb2wgaGFzIHNhbWUgbGF5ZXIgdGhhdCBpcyBjdXJyZW50bHkgc2V0IG9uIGl0J3MgcGFyZW50IHRhYiBjb250cm9sXHJcbiAgICBpZiAoc3VwZXIuaXNDaG9pY2VDb250cm9sKCkpIHtcclxuICAgICAgbGV0IHBhcmVudExheWVyOiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAodGhpcy5WYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmVudExheWVyID0gdGhpcy5nZXRDdXJyZW50TGlua0lkeCgpICsgMTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbGF5ZXI6IG51bWJlciA9IGNoaWxkLmdldExheWVyKCk7XHJcbiAgICAgIGlmIChwYXJlbnRMYXllciAhPT0gbGF5ZXIgJiYgbGF5ZXIgPiAwKSB7XHJcbiAgICAgICAgLy8gc29ucyBvZiBsYXllciAwIGRpc3BsYXllZCBhbHdheXNcclxuICAgICAgICByZXQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gY3VycmVudCBsaW5rIElkeCBvZiBjaG9pY2UgY29udHJvbHMsIG9yIHplcm8gZm9yIG90aGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDdXJyZW50TGlua0lkeCgpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJMaW5rSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSB8fCB0aGlzLkhhc0F1dG9jb21wbGV0ZSgpKSB7XHJcbiAgICAgIGxldCBjdXJyZW50TGF5ZXJzOiBudW1iZXJbXSA9IHRoaXMuZ2V0Q3VycmVudEluZGV4T2ZDaG9pY2UoKTtcclxuICAgICAgbGV0IGN1cnJMaW5rSW5kaWNlOiBudW1iZXJbXSA9IHRoaXMuZ2V0TGlua0lkeEZyb21MYXllcihjdXJyZW50TGF5ZXJzKTtcclxuICAgICAgY3VyckxpbmtJZHggPSBjdXJyTGlua0luZGljZVswXTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyTGlua0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0cyBsYXllciBmcm9tIHRoZSBzZWxlY3RlZCBpbmRpY2UgcGFzc2VkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGlua0lkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmFycmF5IG9mIGxheWVyIHZhbHVlcy48L3JldHVybnM+XHJcbiAgZ2V0TGF5ZXJGcm9tTGlua0lkeChpbmRpY2U6IG51bWJlcltdKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGxheWVyczogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPihpbmRpY2UubGVuZ3RoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgaW5kaWNlLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IGluZGljZVtpQ3RyXTtcclxuICAgICAgLy8gQnkgZGVmYXVsdCwgbGF5ZXIgPSBsaW5rSWR4IHVubGVzcyBpdCBpcyBhIFRhYiBjb250cm9sXHJcblxyXG4gICAgICBsYXllcnNbaUN0cl0gPSBpZHg7XHJcblxyXG4gICAgICBpZiAoc3VwZXIuaXNUYWJDb250cm9sKCkgJiYgaWR4ID49IDApIHtcclxuICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICAgICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgICAgICBsaW5lID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxheWVyTGlzdDogc3RyaW5nW10gPSB0aGlzLl9jaG9pY2VMYXllckxpc3QuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICAgICAgaWYgKGxheWVyTGlzdCAhPT0gbnVsbCAmJiBsYXllckxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGF5ZXJzW2lDdHJdID0gbGF5ZXJMaXN0LmluZGV4T2YoKGlkeCArIDEpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxheWVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyB0aGUgc2VsZWN0ZWQgaW5kaWNlIGZvciBzZWxlY3RlZCB2YWx1ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXllcnNcIj5hbiBhcnJheSBvZiBjdXJyZW50IGxheWVycyB0YWIgY29udHJvbHMuIEl0IGNhbiBiZSBhcnJheSBiZWNhdXNlIG9mIG11bHRpcGxlIHNlbGVjdGlvbi48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5hcnJheSBvZiBpbmRpY2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRMaW5rSWR4RnJvbUxheWVyKGxheWVyczogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgbGlua0luZGljZTogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPihsYXllcnMubGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCBsYXllcnMubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgbGV0IGxheWVyOiBudW1iZXIgPSBsYXllcnNbaUN0cl07XHJcbiAgICAgIGxpbmtJbmRpY2VbaUN0cl0gPSBsYXllcjtcclxuICAgICAgaWYgKHN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgaWYgKGxheWVyIDwgMCkge1xyXG4gICAgICAgICAgbGlua0luZGljZVtpQ3RyXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgICAgICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgICAgICAgIGxpbmUgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGxheWVyTGlzdDogc3RyaW5nW10gPSB0aGlzLl9jaG9pY2VMYXllckxpc3QuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICAgICAgICBpZiAobGF5ZXJMaXN0ICE9PSBudWxsICYmIHR5cGVvZiBsYXllckxpc3QgIT09IFwidW5kZWZpbmVkXCIgJiYgbGF5ZXJMaXN0Lmxlbmd0aCAhPT0gMCAmJiBsYXllciA8IGxheWVyTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGlua0luZGljZVtpQ3RyXSA9IE5OdW1iZXIuUGFyc2UobGF5ZXJMaXN0W2xheWVyXSkgLSAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxpbmtJbmRpY2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjdXJzaXZlIG1ldGhvZCwgY2hlY2tzIGlmIHBhcmVudCBvZiB0aGUgY2hpbGQgaXMgdmlzaWJsZVxcZW5hYmxlLCB1bHRpbCB0aGVyZSBpcyBubyBwYXJlbnQgb3IgZm91bmRcclxuICAvLy8gICBwYXJlbnQgdGhhdCBpcyBoaWRkZW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUGFyZW50UHJvcFZhbHVlKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY29sdW1uOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5Gb3JtLmdldENvbnRyb2xDb2x1bW4odGhpcyk7XHJcbiAgICBsZXQgcGFyZW50OiBNZ0NvbnRyb2xCYXNlID0gPE1nQ29udHJvbEJhc2U+dGhpcy5nZXRMaW5rZWRQYXJlbnQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbjtcclxuXHJcbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgIC8vIG5vIG1vcmUgcGFyZW50c1xyXG4gICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIHBhcmVudCBpcyBoaWRkZW5cclxuICAgICAgaWYgKCFwYXJlbnQuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCB0cnVlKSkge1xyXG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRPbkN1cnJlbnRMYXllcih0aGlzKSkge1xyXG4gICAgICAgICAgLy8gcGFyZW50IGlzIHRhYiBjb250cm9sIHdpdGggY3VycmVudCBsYXllclxyXG4gICAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gY2hpbGQncyBsYXllclxyXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gZm9yIHRhYmxlIGNoaWxkcmVuIGNoZWNrIGlmIGNvbHVtbiB2aXNpYmxlXHJcbiAgICAgICAgICByZXN1bHQgPSAoIShjb2x1bW4gIT09IG51bGwgJiYgIWNvbHVtbi5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIHRydWUpKSAmJiBwYXJlbnQuaXNQYXJlbnRQcm9wVmFsdWUocHJvcElkKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBjb250cm9sIHRvIHdoaWNoIHRoaXMgY29udHJvbCBpcyBsaW5rZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tTdWJmb3JtRmF0aGVyXCI+aWYgdHJ1ZSBjaGVjayBmb3IgU3ViZm9ybSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExpbmtlZFBhcmVudChjaGVja1N1YmZvcm1GYXRoZXI6IGJvb2xlYW4pOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIHtcclxuXHJcbiAgICBpZiAodGhpcy5fbGlua2VkUGFyZW50RGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fbGlua2VkUGFyZW50RGl0SWR4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoY2hlY2tTdWJmb3JtRmF0aGVyICYmIHRoaXMuRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGN1cnJlbnQgbGluZSB2YWx1ZSBvZiB0aGUgcmVhZE9ubHkgaGlzdG9yeSBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWxcIj50aGUgbmV3IHZhbHVlIHRvIGJlIHNldDwvcGFyYW0+XHJcbiAgU2V0Q3VyclJlYWRPbmx5KG5ld1ZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VyclJlYWRPbmx5LnNldF9JdGVtKHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSksIG5ld1ZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdXJyZW50IHJlYWRPbmx5IHZhbHVlIGFjY29yZGluZyB0byB0aGUgY29udHJvbCdzIGN1cnJlbnQgbGluZSBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlYWRPbmx5IHZhbHVlPC9yZXR1cm5zPlxyXG4gIEdldEN1cnJSZWFkT25seSgpOiBib29sZWFuIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSBzdXBlci5pc1RhYmxlQ29udHJvbCgpID8gMCA6IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBsZXQgY3Vyck9iajogYW55ID0gdGhpcy5fY3VyclJlYWRPbmx5LmdldF9JdGVtKGxpbmUpO1xyXG4gICAgbGV0IGN1cnI6IGJvb2xlYW47XHJcbiAgICBpZiAoY3Vyck9iaiA9PT0gbnVsbCkge1xyXG4gICAgICBjdXJyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2N1cnJSZWFkT25seS5zZXRfSXRlbShsaW5lLCBjdXJyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdXJyID0gPGJvb2xlYW4+Y3Vyck9iajtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbnRyb2wgaXMgYSBEYXRhIENvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzRGF0YUN0cmwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YUN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBkY3JlZiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbGluZSBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGRjSWQ8L3JldHVybnM+XHJcbiAgZ2V0RGNSZWYoKTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERjTGluZU51bSgpO1xyXG4gICAgbGV0IG9iajogYW55ID0gdGhpcy5fZGNUYWJsZVJlZnMuZ2V0X0l0ZW0odGhpcy5nZXREY0xpbmVOdW0oKSk7XHJcbiAgICBsZXQgZGNJZDogbnVtYmVyO1xyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xyXG4gICAgICBkY0lkID0gLTI7XHJcbiAgICAgIHRoaXMuX2RjVGFibGVSZWZzLnNldF9JdGVtKGxpbmUsIGRjSWQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRjSWQgPSA8bnVtYmVyPm9iajtcclxuICAgIH1cclxuICAgIHJldHVybiBkY0lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgZm9yIGEgZGF0YSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldERjTGluZU51bSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNSZXBlYXRhYmxlID8gdGhpcy5Gb3JtLkRpc3BsYXlMaW5lIDogMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGUgb25lIGNob2ljZSBvcHRpb24gZnJvbSBpdGVtcyBsaXN0IGlzIHZhbGlkLiBUaGUgY2hlY2sgaXMgb25seSBmb3IgaXRlbXMgbGlzdCBhbmQgbm90IGZvciB0aGVcclxuICAvLy8gICBkYXRhIHNvdXJjZSBvcHRpb25zLCAoRllJOiBmb3IgdGhlIG9wdGlvbiBmcm9tIHRoZSBEYXRhQ3RybCwgd2UgYXJlIG5vdCBjYWxsaW5nIHRoaXNcclxuICAvLy8gICBtZXRob2QsIE5PIENIRUNLIElTIERPTkUpIGluIG9ubGluZSA6Y2lfY2hlY2tfcmFuZ2Vfc3RyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wdGlvbjpcIj5vbmUgb3B0aW9uIGZyb20gdGhlIGl0ZW1zIGxpc3Q8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBvcHRpb25Jc1ZhbGlkKG9wdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyAmJiBvcHRpb24ubGVuZ3RoID4gMCAmJiBvcHRpb24uaW5kZXhPZignMCcpID09PSAtMSkge1xyXG4gICAgICBsZXQgY29udmVydE51bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgICAgY29udmVydE51bS5udW1fNF9hX3N0ZChvcHRpb24pO1xyXG4gICAgICBpZiAoY29udmVydE51bS5udW1faXNfemVybygpKSB7XHJcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNWYWxpZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcmVwYXJlcyBhbmQgcmV0dXJucyB0aGUgb3JkZXJlZCBsaXN0IGJhc2VkIG9uIGxheWVycyBpbiBsYXllckxpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hvaWNlRGlzcExpc3RcIj51bm9yZGVyZWQgbGlzdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyZWREaXNwTGlzdChjaG9pY2VEaXNwTGlzdDogc3RyaW5nW10sIGxpbmU6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuXHJcbiAgICBsZXQgY2hvaWNlTGF5ZXJTdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgZGlzcEFycnlMaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgbGF5ZXJBcnJ5TGlzdDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IGxheWVyUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MQVlFUlNfTElTVCk7XHJcblxyXG4gICAgaWYgKGxheWVyUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICBjaG9pY2VMYXllclN0ciA9IGF3YWl0IGxheWVyUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaG9pY2VMYXllclN0ciA9PT0gbnVsbCB8fCBTdHJVdGlsLnJ0cmltKGNob2ljZUxheWVyU3RyKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgY2hvaWNlTGF5ZXJTdHIgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKGNob2ljZUxheWVyU3RyLmxlbmd0aCA+IDAgJiYgY2hvaWNlRGlzcExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgbGF5ZXJMaXN0OiBzdHJpbmdbXSA9IGNob2ljZUxheWVyU3RyLnNwbGl0KFwiLFwiKTtcclxuICAgICAgbGV0IHBvc0NvcHlJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgICAgIGZvciAobGV0IGluZGV4OiBudW1iZXIgPSAwOyBpbmRleCA8IGxheWVyTGlzdC5sZW5ndGg7IGluZGV4ID0gaW5kZXggKyAxKSB7XHJcbiAgICAgICAgbGV0IGN1cnJMYXllckxpc3RWYWw6IHN0cmluZyA9IGxheWVyTGlzdFtpbmRleF0udHJpbSgpO1xyXG4gICAgICAgIGlmICghKGxheWVyQXJyeUxpc3QuaW5kZXhPZihjdXJyTGF5ZXJMaXN0VmFsKSAhPT0gLTEpKSB7XHJcbiAgICAgICAgICBsZXQgcmVmUG9zQ29weUluZGV4OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4ocG9zQ29weUluZGV4KTtcclxuICAgICAgICAgIGxldCBpc051bWJlcjogYm9vbGVhbiA9IE5OdW1iZXIuVHJ5UGFyc2UoY3VyckxheWVyTGlzdFZhbCwgcmVmUG9zQ29weUluZGV4KTtcclxuICAgICAgICAgIHBvc0NvcHlJbmRleCA9IHJlZlBvc0NvcHlJbmRleC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAvLyBwb3NDb3B5SW5kZXggaXMgMUJhc2VkLCBzbyBtdXN0IG5vdCBiZSB6ZXJvLiBBbHNvLCBpdCBtdXN0IG5vdCBiZVxyXG4gICAgICAgICAgLy8gZ3JlYXRlciB0aGFuIG5vIG9mIGVsZW1lbnRzIGluIHRoZSBEaXBsYXlMaXN0LlxyXG5cclxuICAgICAgICAgIGlmIChpc051bWJlciAmJiBwb3NDb3B5SW5kZXggPiAwICYmIHBvc0NvcHlJbmRleCA8PSBjaG9pY2VEaXNwTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZGlzcEFycnlMaXN0LnB1c2goKGNob2ljZURpc3BMaXN0W3Bvc0NvcHlJbmRleCAtIDFdKS50cmltKCkpO1xyXG4gICAgICAgICAgICBsYXllckFycnlMaXN0LnB1c2goY3VyckxheWVyTGlzdFZhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nW107XHJcbiAgICBpZiAoZGlzcEFycnlMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXN1bHQgPSBjaG9pY2VEaXNwTGlzdDtcclxuICAgICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIG5ldyBBcnJheTxzdHJpbmc+KDApKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBuZXcgQXJyYXk8c3RyaW5nPihkaXNwQXJyeUxpc3QubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCByZXN1bHQubGVuZ3RoOyArK19haSlcclxuICAgICAgICByZXN1bHRbX2FpXSA9IG51bGw7XHJcblxyXG4gICAgICByZXN1bHQgPSBkaXNwQXJyeUxpc3QuVG9BcnJheSgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VMYXllckxpc3Quc2V0X0l0ZW0obGluZSwgbGF5ZXJBcnJ5TGlzdC5Ub0FycmF5KCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgcHJldmlvdXMgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0UHJldlZhbCgpOiB2b2lkIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgIGxpbmUgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuc2V0UHJldklzTnVsbF9Ub051bGwoKTtcclxuICB9XHJcblxyXG4gIC8vLyAgIHNldHMgdGhlIHByZXZJc051bGwgdmFsdWUgb2YgdGhlIHByZXZJc051bGwgYXJyYXlcclxuICAvLy8gICB0aGUgbmV3VmFsdWUgY2FuIGJlIE5VTEwgb3IgYm9vbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0UHJldklzTnVsbF9Ub051bGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmIGFuIGV4cHJlc3Npb24gd2FzIHNldCBhcyB0aGUgZGF0YTwvcmV0dXJucz5cclxuICBleHByZXNzaW9uU2V0QXNEYXRhKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbEV4cElkID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNob2ljZSBsaXN0IG9mIGEgU0VMRUNUIGNvbnRyb2wgaGFzIGNoYW5nZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyUmFuZ2UobGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuX2Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGlua3Muc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3Quc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGF2ZSB0byBjaGVjayBwYXJlbnQgdmlzaWJpbGl0eVxcZW5hYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSwgaWYgdGhlIGNvbnRyb2wgaXMgY29ubmVjdGVkIHRvIGEgY29udGFpbmVyIG9yIHRoZSB0YXNrIGlzIGEgc3ViZm9tPC9yZXR1cm5zPlxyXG4gIGhhdmVUb0NoZWNrUGFyZW50VmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fbGlua2VkUGFyZW50RGl0SWR4ICE9PSAtMSkge1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzQ29udGFpbmVkSW5MaW5rZWRQYXJlbnQoKSkge1xyXG4gICAgICAgIHJldCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY29udGFpbmVkIHRhYiBjaGlsZHJlbiBvZiBhbGwgbGF5ZXJzIGFyZSBvbiB0aGUgc2FtZSB3aW5kb3csXHJcbiAgICAgIC8vIHNvIHdlIG11c3QgaGFuZGxlIHRoZXJlIHZpc2liaWxpdHlcXGVuYWJsZVxyXG5cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCkuaXNUYWJDb250cm9sKCkgfHwgdGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fbGlua2VkUGFyZW50RGl0SWR4KS5pc0dyb3VwKCkpIHtcclxuICAgICAgICAgIHJldCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgIHJldCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGNvbnRyb2wgaXMgY29udGFpbiBpbiBpdHMgbGlua2VkIHBhcmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0NvbnRhaW5lZEluTGlua2VkUGFyZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lckRpdElkeCAhPT0gLTEgJiYgdGhpcy5fY29udGFpbmVyRGl0SWR4ID09PSB0aGlzLl9saW5rZWRQYXJlbnREaXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tYmluZSB0d28gc3RyaW5ncyBhcnJheSBpbnRvIG9uZS4gRWFjaCBvZiB0aGUgb3JpZ2luYWwgYXJyYXlzIG1heSBiZSBudWxsLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmaXJzdFN0cmluZ3NcIj50aGUgZmlyc3Qgc3RyaW5ncyBhcnJheSB0aGF0IHdpbGwgYWx3YXlzIG9jY3VweSB0aGUgZmlyc3QgYXJyYXkgY2VsbHM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGFzdFN0cmluZ3NcIj50aGUgbGFzdCBzdHJpbmdzIGFycmF5IHRoYXQgd2lsbCBhbHdheXMgb2NjdXB5IHRoZSBsYXN0IGFycmF5IGNlbGxzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGNvbWJpbmVkIFN0cmluZ3MgYXJyYXk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgY29tYmluZVN0cmluZ0FycmF5cyhmaXJzdFN0cmluZ3M6IHN0cmluZ1tdLCBsYXN0U3RyaW5nczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG4gICAgaWYgKGZpcnN0U3RyaW5ncyAhPT0gbnVsbClcclxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChmaXJzdFN0cmluZ3MpO1xyXG5cclxuICAgIGlmIChsYXN0U3RyaW5ncyAhPT0gbnVsbClcclxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChsYXN0U3RyaW5ncyk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuICBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbiwgbGluZT86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgKHByb3BJZCA9PT0gbnVsbCB8fCBwcm9wSWQuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKGRlZmF1bHRSZXRWYWwgPT09IG51bGwgfHwgZGVmYXVsdFJldFZhbC5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChwcm9wSWQsIGRlZmF1bHRSZXRWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMShwcm9wSWQsIGRlZmF1bHRSZXRWYWwsIGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGJvb2xlYW4gY29tcHV0ZWQgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8wKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQpO1xyXG4gICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gcHJvcC5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2wgLSBpZiB0aGUgY29udHJvbCBpcyByZXBlYXRhYmxlIGFuZCB0aGUgbGluZSBpc1xyXG4gIC8vLyBkaWZmZXJlbnQgdGhhbiB0aGUgZm9ybXMgY3VycmVudCBsaW5lIHRoZW4gcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgY29udHJvbCBwcm9wZXJ0eSBhdCB0aGF0IGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSBsaW5lIG51bWJlciBpbiB0YWJsZSBpbiB3aGljaCB0aGUgY29udHJvbCBpcyBsb2NhdGVkPC9wYXJhbT5cclxuICBwcml2YXRlIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzEocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4sIGxpbmU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNQcm9wZXJ0eVJlcGVhdGFibGUocHJvcElkKSAmJiB0aGlzLkZvcm0uRGlzcGxheUxpbmUgIT09IGxpbmUpIHtcclxuICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZCk7XHJcbiAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gcHJvcC5nZXRQcmV2VmFsdWUobGluZSk7XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgZGVmYXVsdFJldFZhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sIC0gaWYgdGhlIGNvbnRyb2wgaXMgcmVwZWF0YWJsZSBhbmQgdGhlIGxpbmUgaXNcclxuICAvLy8gICBkaWZmZXJlbnQgdGhhbiB0aGUgZm9ybXMgY3VycmVudCBsaW5lIHRoZW4gcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgY29udHJvbCBwcm9wZXJ0eSBhdCB0aGF0XHJcbiAgLy8vICAgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgbnVtYmVyIGluIHRhYmxlIGluIHdoaWNoIHRoZSBjb250cm9sIGlzIGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIGFzeW5jIGNoZWNrUHJvcFdpdGhMaW5lKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuLCBsaW5lOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG5cclxuICAgIGlmICh0aGlzLmlzUHJvcGVydHlSZXBlYXRhYmxlKHByb3BJZCkgJiYgdGhpcy5Gb3JtLkRpc3BsYXlMaW5lICE9PSBsaW5lKSB7XHJcbiAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChwcm9wSWQpO1xyXG4gICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IHByb3AuZ2V0UHJldlZhbHVlKGxpbmUpO1xyXG4gICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5jaGVja1Byb3AocHJvcElkLCBkZWZhdWx0UmV0VmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIGFzeW5jIGNoZWNrUHJvcChwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AocHJvcElkKTtcclxuICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHByb3AuZ2V0VmFsdWVCb29sZWFuKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBwcm9wSWQgcHJvcGVydHkgaXMgcmVwZWF0YWJsZSBmb3IgdGhpcyBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1Byb3BlcnR5UmVwZWF0YWJsZShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzUmVwZWF0YWJsZTogYm9vbGVhbiA9IHRoaXMuSXNSZXBlYXRhYmxlO1xyXG4gICAgaWYgKGlzUmVwZWF0YWJsZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiBQcm9wZXJ0eS5pc1JlcGVhdGFibGVJblRhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgYW5kIHVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBpbiBtYWdpYyBpbnRlcm5hbCBmb3JtYXQgdG8gYmUgZGlzcGxheWVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIGFzeW5jIFNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUobWdWYWw6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGNSYW5nZUlzRW1wdHk6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmIChtZ1ZhbCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLlZhbHVlID0gXCJcIjtcclxuICAgICAgLy8gUUNSIDMwODQ3NSAtIGNvbnRyb2xzIHRoYXQgYXJlIEluaXRpYWxpemVkIHdpdGggbnVsbCBzaG91bGQgYmUgZ2l2ZW4gbWFnaWMgZGVmYXVsdCB2YWx1ZS5cclxuICAgICAgaWYgKCFpc051bGwpXHJcbiAgICAgICAgbWdWYWwgPSBGaWVsZERlZi5nZXRNYWdpY0RlZmF1bHRWYWx1ZSh0aGlzLkRhdGFUeXBlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoc3VwZXIuaXNDaG9pY2VDb250cm9sKCkpIHtcclxuICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgICAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgICAgIGxpbmUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbGF5ZXJzOiBudW1iZXJbXSA9IHRoaXMuZ2V0TGF5ZXJGcm9tTGlua0lkeChhd2FpdCB0aGlzLmdldEluZGV4T2ZDaG9pY2UobWdWYWwsIGxpbmUsIGlzTnVsbCkpO1xyXG5cclxuICAgICAgICAvLyBXZSBkbyBub3QgYWxsb3cgbm8gc2VsZWN0aW9uIGZvciBhIHRhYiBjb250cm9sLlxyXG4gICAgICAgIC8vIFNvLCBpZiB0aGVyZSBpcyBubyBUYWIgdG8gYmUgc2VsZWN0ZWQsIHNlbGVjdCB0aGUgZmlyc3QgVGFiIGFuZFxyXG4gICAgICAgIC8vIGFsc28gdXBkYXRlIHRoZSBmaWVsZCdzIHZhbHVlIGFjY29yZGluZ2x5LlxyXG5cclxuICAgICAgICBpZiAobGF5ZXJzWzBdIDwgMCAmJiBzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgbGF5ZXJzWzBdID0gMDtcclxuICAgICAgICAgIG1nVmFsID0gYXdhaXQgdGhpcy5nZXRMaW5rVmFsdWUobGF5ZXJzWzBdLnRvU3RyaW5nKCksIGxpbmUpO1xyXG4gICAgICAgICAgaXNOdWxsID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwgJiYgbWdWYWwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgYXdhaXQgKDxHdWlUYXNrQmFzZT50aGlzLl9maWVsZC5nZXRUYXNrKCkpLlVwZGF0ZUZpZWxkVmFsdWVBbmRTdGFydFJlY29tcHV0ZSh0aGlzLl9maWVsZCwgbWdWYWwsIGlzTnVsbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuVmFsdWUgPSBNaXNjLkdldENvbW1hU2VwZXJhdGVkU3RyaW5nKGxheWVycyk7XHJcbiAgICAgICAgZGNSYW5nZUlzRW1wdHkgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiAjNDUwMjQ4OiBhbiBlbXB0eSByYW5nZSBpbiB0aGUgZGF0YSBjb250cm9sIGNhdXNlZCBkZWxldGluZyB0aGUgdmFsdWVcclxuICAgIC8vIG9mIHRoZSBjb250cm9sIHdoZW4gbGVhdmluZyBpdC4gTm93LCB0aGUgcmFuZ2Ugb2YgdGhlIGNvbnRyb2wgaXMgdXNlZCB3aGVuXHJcbiAgICAvLyB0aGUgZGF0YSBjb250cm9sIHJhbmdlIGlzIGVtcHR5LlxyXG4gICAgaWYgKGRjUmFuZ2VJc0VtcHR5KSB7XHJcbiAgICAgIGlmICghc3VwZXIuaXNDaGVja0JveCgpICYmICh0aGlzLl9maWVsZCA9PT0gbnVsbCB8fCAhaXNOdWxsIHx8ICF0aGlzLl9maWVsZC5oYXNOdWxsRGlzcGxheVZhbHVlKCkpKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGlmICgoc3VwZXIuaXNJbWFnZUNvbnRyb2woKSAmJiB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHx8IHN1cGVyLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICAgICAgICB0aGlzLlZhbHVlID0gbWdWYWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCh0aGlzLl9maWVsZCA9PT0gbnVsbCAmJiBpc051bGwpICYmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSB8fCB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IG1nVmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBpbkNvbnRyb2w6IGJvb2xlYW4gPSB0aGlzLkluQ29udHJvbDtcclxuICAgICAgICAgICAgICB0aGlzLlZhbHVlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKG1nVmFsLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0cnVlLCBzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSwgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgaW5Db250cm9sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRGVmZWN0ICMgMTM4ODAzIDogRml4IHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVuaVBhYVMuIERvIG5vdCBjYWxsIHJ0cmltVmFsdWUoKSB3aGVuIHJlZnJlc2hpbmcgdGhlIGRpc3BsYXkgaWYgdGhlIGRhdGEgdHlwZVxyXG4gICAgICAgICAgLy8gaXMgbm90IG51bWVyaWMgb3IgbGVmdCBqdXN0aWZ5IHByb3BlcnR5IGlzIE5vLlxyXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLlZhbHVlID09PSAnc3RyaW5nJyAmJiAoIXRoaXMuX3BpYy5pc0F0dHJOdW1lcmljKCkgfHwgdGhpcy5fcGljLmlzTGVmdCgpKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJ0cmltVmFsdWUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChpbm5lckV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgaWYgKGlubmVyRXhjZXB0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2cobmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKE5TdHJpbmcuRm9ybWF0KFwiQ29udHJvbDogJ3swfScsIG1ndmFsOiB7MX1cIiwgdGhpcy5OYW1lLCBtZ1ZhbCksIGlubmVyRXhjZXB0aW9uKSk7XHJcbiAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICBtZ1ZhbCA9IEZpZWxkRGVmLmdldE1hZ2ljRGVmYXVsdFZhbHVlKHRoaXMuRGF0YVR5cGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBpbm5lckV4Y2VwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDaGVja0JveCgpKVxyXG4gICAgICAgICAgdGhpcy5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKG1nVmFsKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLlZhbHVlID0gbWdWYWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFRyYW5zbGF0ZSBsb2dpY2FsIG5hbWUgZm9yIGltYWdlIGNvbnRyb2wuXHJcbiAgICBpZiAoKHN1cGVyLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB8fCBzdXBlci5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgbWdWYWwgPSBFdmVudHMuVHJhbnNsYXRlTG9naWNhbE5hbWUobWdWYWwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jc051bGwgPSBpc051bGw7XHJcbiAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5VmFsdWUobWdWYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDaGVja3MgaWYgdGhlIGNvbnRyb2wncyB2YWx1ZSBpcyBtb2RpZmllZCBhbmQgaWYgc28sIHVwZGF0ZXMgdGhlIE1vZGlmaWVkQnlVc2VyIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgVXBkYXRlTW9kaWZpZWRCeVVzZXIobmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIC8vIEZvciBpbWFnZSBjb250cm9sIGFuZCBpbWFnZSBidXR0b24sIHRoZSB2YWx1ZSB3b3VsZCBub3QgYmUgY2hhbmdlZCBieSB0aGUgdXNlci4gQnV0LCBpZiBpdCBoYXNcclxuICAgIC8vIGEgbG9naWNhbCBuYW1lLCBpdCBpcyByZXBsYWNlZC4gT3IgaWYgaXQgaXMgZmlsZVNlcnZlciBnZXQsIHRoZSB2YWx1ZSBpcyByZXBsYWNlZCBieSBhIHNlcnZlciB1cmwuXHJcbiAgICAvLyBJbiBib3RoIHRoZXNlIGNhc2VzLCB3ZSBzaG91bGQgbm90IG1hcmsgaXQgYXMgbW9kaWZpZWQuXHJcbiAgICBpZiAoIShzdXBlci5pc0J1dHRvbigpIHx8IHN1cGVyLmlzSW1hZ2VDb250cm9sKCkpKSB7XHJcbiAgICAgIGxldCBjdHJsQ3VycklzTnVsbDogYm9vbGVhbiA9IHRoaXMuSXNOdWxsO1xyXG4gICAgICBsZXQgdmFsQ2hhbmdlZDogYm9vbGVhbiA9ICh0aGlzLmlzRGlmZmVyZW50VmFsdWUobmV3VmFsdWUsIGZhbHNlLCBmYWxzZSkpO1xyXG5cclxuICAgICAgLy8gaWYgdGhlIHZhbHVlIGRpZG4ndCBjaGFuZ2UgdGhlbiBsZXQncyBjaGVjayBpZiB0aGUgbnVsbGl0eSBoYXZlIGNoYW5nZWRcclxuICAgICAgaWYgKCF2YWxDaGFuZ2VkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQ2FuR2V0TnVsbEZyb21Db250cm9sVmFsdWUoKSkge1xyXG4gICAgICAgICAgdmFsQ2hhbmdlZCA9IChjdHJsQ3VycklzTnVsbCAhPT0gdGhpcy5pc051bGxWYWx1ZShuZXdWYWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsQ2hhbmdlZCB8fCB0aGlzLktleVN0cm9rZU9uKSB7XHJcbiAgICAgICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSVHJpbXMgdGhlIGNvbnRyb2wgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgcnRyaW1WYWx1ZSgpOiB2b2lkIHtcclxuICAgIGlmICgoc3VwZXIuaXNJbWFnZUNvbnRyb2woKSAmJiB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHx8IHN1cGVyLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICB0aGlzLlZhbHVlID0gTlN0cmluZy5UcmltRW5kKHRoaXMuVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBtaW5pbXVtVmFsdWVMZW5ndGg6IG51bWJlciA9IHRoaXMuZ2V0TWluaW11bVZhbHVlTGVuZ3RoKCk7XHJcbiAgICAgIC8vIFJUcmltIHRoZSB2YWx1ZSBiZXlvbmQgdGhpcyBpbmRleFxyXG4gICAgICBpZiAodGhpcy5WYWx1ZS5sZW5ndGggPiBtaW5pbXVtVmFsdWVMZW5ndGgpIHtcclxuICAgICAgICBsZXQgc3RyOiBzdHJpbmcgPSB0aGlzLlZhbHVlLnN1YnN0cihtaW5pbXVtVmFsdWVMZW5ndGgpO1xyXG5cclxuICAgICAgICAvLyBjb3B5IHRoZSBtaW5pbXVtIGxlbmd0aCB2YWx1ZSBhcyBpc1xyXG4gICAgICAgIHRoaXMuVmFsdWUgPSB0aGlzLlZhbHVlLnN1YnN0cigwLCBtaW5pbXVtVmFsdWVMZW5ndGgpO1xyXG4gICAgICAgIC8vIHJ0cmltIHRoZSB2YWx1ZSBiZXlvbmQgbWluaW11bSBsZW5ndGhcclxuICAgICAgICB0aGlzLlZhbHVlID0gdGhpcy5WYWx1ZSArIFN0clV0aWwucnRyaW1XaXRoTnVsbChzdHIsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhbHdheXMgdHJpbSB0aGUgbnVtZXJpYyB2YWx1ZS5cclxuICAgICAgaWYgKHN1cGVyLmlzVGV4dENvbnRyb2woKSAmJiB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpIHtcclxuICAgICAgICB0aGlzLlZhbHVlID0gTlN0cmluZy5UcmltRW5kKHRoaXMuVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZSBsZW5ndGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0TWluaW11bVZhbHVlTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICBsZXQgbWluTGVuZ3RoOiBudW1iZXIgPSB0aGlzLl9waWMuZ2V0TWFza0xlbmd0aCgpO1xyXG5cclxuICAgIC8vIHRyYXZlcnNlIGZyb20gcmlnaHQgdGlsbCBhIHZhbGlkIG1hc2sgY2hhciBpcyBlbmNvdW50ZXJlZFxyXG4gICAgd2hpbGUgKG1pbkxlbmd0aCA+IDAgJiYgIXRoaXMuX3BpYy5waWNJc01hc2sobWluTGVuZ3RoIC0gMSkpIHtcclxuICAgICAgbWluTGVuZ3RoID0gbWluTGVuZ3RoIC0gMTtcclxuICAgIH1cclxuICAgIHJldHVybiBtaW5MZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzTnVsbFZhbHVlKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0SXNOdWxsQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuQ2FuR2V0TnVsbEZyb21Db250cm9sVmFsdWUoKSAmJiBzdHIgPT09IFwiXCIpIHtcclxuICAgICAgcmV0SXNOdWxsQ29udHJvbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SXNOdWxsQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0aGlzIGNvbnRyb2wgY2FuIGdldCBudWxsIHZhbHVlIGZyb20gdGhlIGNvbnRyb2wgaGltc2VsZlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBDYW5HZXROdWxsRnJvbUNvbnRyb2xWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBzcGVjaWZpYyBpbmRleCBjb3JyZXNwb25kcyB0byBhIG51bGwgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0Nob2ljZU51bGwoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgbGV0IGRjVmFsczogRGNWYWx1ZXMgPSB0aGlzLmdldERjVmFscygpO1xyXG4gICAgICByZXR1cm4gZGNWYWxzLmlzTnVsbChpZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvbXB1dGVzIHRoZSBjb250cm9sJ3MgdmFsdWUgZWl0aGVyIGZyb20gZXhwcmVzc2lvbiBvciBmaWVsZCBhbmQgcmVmcmVzaGVzIHRoZSBHVUkgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcmNlUmVmcmVzaFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZm9yY2VSZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgIHRoaXMucmVzZXRQcmV2VmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbEV4cElkID4gMCkge1xyXG4gICAgICBsZXQgd2FzRXZhbHVhdGVkOiBib29sZWFuO1xyXG4gICAgICBsZXQgcmVmV2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbTxib29sZWFuPih3YXNFdmFsdWF0ZWQpO1xyXG5cclxuICAgICAgbGV0IHJldEV4cDogc3RyaW5nID1cclxuICAgICAgICBhd2FpdCB0aGlzLkV2YWx1YXRlRXhwcmVzc2lvbih0aGlzLl92YWxFeHBJZCwgdGhpcy5EYXRhVHlwZSwgdGhpcy5fcGljLmdldFNpemUoKSwgdHJ1ZSwgU3RvcmFnZUF0dHJpYnV0ZS5TS0lQLCBmYWxzZSwgcmVmV2FzRXZhbHVhdGVkKTtcclxuICAgICAgd2FzRXZhbHVhdGVkID0gcmVmV2FzRXZhbHVhdGVkLnZhbHVlO1xyXG4gICAgICBpZiAod2FzRXZhbHVhdGVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKHJldEV4cCwgcmV0RXhwID09PSBudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWx1ZTogc3RyaW5nID0gTlN0cmluZy5FbXB0eTtcclxuICAgICAgICBsZXQgaXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHJlZlZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+ID0gbmV3IFJlZlBhcmFtPHN0cmluZz4odmFsdWUpO1xyXG4gICAgICAgIGxldCByZWZJc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtPGJvb2xlYW4+KGlzTnVsbCk7XHJcbiAgICAgICAgKDxHdWlUYXNrQmFzZT50aGlzLl9maWVsZC5nZXRUYXNrKCkpLmdldEZpZWxkRGlzcGxheVZhbHVlKHRoaXMuX2ZpZWxkLCByZWZWYWx1ZSwgcmVmSXNOdWxsKTtcclxuICAgICAgICB2YWx1ZSA9IHJlZlZhbHVlLnZhbHVlO1xyXG4gICAgICAgIGlzTnVsbCA9IHJlZklzTnVsbC52YWx1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLlNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUodmFsdWUsIGlzTnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFzdXBlci5pc1RhYmxlQ29udHJvbCgpICYmICFzdXBlci5pc0NvbHVtbkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheVZhbHVlKHRoaXMuVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBEZWNpZGVzIGlmIHRoZSBjb250cm9sIHNob3VsZCBiZSByZWZyZXNoZWQgd2hpbGUgZW50ZXJpbmcgYSBjb250cm9sLiBWYWx1ZXMgZm9yIHNvbWUgZGF0YSB0eXBlc1xyXG4gIC8vLyBhcmUgZGlzcGxheWVkIGRpZmZlcmVudGx5IHdoaWxlIHBhcmtlZCBvbiB0aGUgY29udHJvbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkUmVmcmVzaE9uQ29udHJvbEVudGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVCAmJiB0aGlzLmdldEZpZWxkKCkgIT09IG51bGwgJiYgKHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fFxyXG4gICAgICB0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUgfHwgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBkaXNwbGF5ZWQgdmFsdWUgb25seSAod2l0aG91dCB0aGUgb3RoZXIgcHJvcGVydGllcyBvZiB0aGUgY29udHJvbClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj5pcyB0aGUgbWFnaWMgaW50ZXJuYWwgdmFsdWUgb2YgdGhlIHByZXNlbnRhdGlvbiB2YWx1ZTwvcGFyYW0+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCB2YWx1ZUNoYW5nZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHNhdmVWYWx1ZUNoYW5nZWQ6IGJvb2xlYW4gPSB2YWx1ZUNoYW5nZWQ7XHJcblxyXG4gICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgIGxpbmUgPSAwO1xyXG4gICAgfVxyXG4gICAgLy8gQVRURU5USU9OOlxyXG4gICAgLy8gdGhlIHVzZSBvZiB0aGUgZnVuY3Rpb24gZ2V0TmFtZSgpIGluc3RlYWQgb2YgdXNpbmcgdGhlIG5hbWUgbWVtYmVyIHZhcmlhYmxlXHJcbiAgICAvLyBpcyB0byBlbmhhbmNlIHRoZSB1c2Ugb2YgY29udHJvbHMgd2hpY2ggYXJlIGNvbnRhaW5lZCBpbiBhIHRhYmxlXHJcbiAgICAvLyB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAgIHRyeSB7XHJcblxyXG4gICAgICBsZXQgcHJldlZhbHVlOiBzdHJpbmcgPSB0aGlzLl9wcmV2VmFsdWVzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgICBsZXQgcHJldk51bGw6IGJvb2xlYW4gPSB0aGlzLmdldFByZXZJc051bGwoKTtcclxuXHJcbiAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suSXNUeXBlQWxwaGFPclVuaWNvZGUodGhpcy5EYXRhVHlwZSkpIHtcclxuICAgICAgICBpZiAoU3RyVXRpbC5ydHJpbShtZ1ZhbCkgPT09IFN0clV0aWwucnRyaW0ocHJldlZhbHVlKSB8fFxyXG4gICAgICAgICAgKG1nVmFsICE9PSBudWxsICYmIFN0clV0aWwucnRyaW0obWdWYWwpID09PSBTdHJVdGlsLnJ0cmltKHByZXZWYWx1ZSkpKSB7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmV2TnVsbCAhPT0gdGhpcy5Jc051bGwpIHtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIDtcclxuICAgICAgICBpZiAobWdWYWwgPT09IHByZXZWYWx1ZSB8fCAobWdWYWwgIT09IG51bGwgJiYgbWdWYWwgPT09IHByZXZWYWx1ZSkpXHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHByZXZOdWxsICE9PSB0aGlzLklzTnVsbClcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0obGluZSwgbWdWYWwpO1xyXG4gICAgICB0aGlzLnNldFByZXZJc051bGwodGhpcy5Jc051bGwpO1xyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLlR5cGUpIHtcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTEFCRUw6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfR1JPVVA6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVEFUVVNfQkFSOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfU0VUOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09OVEFJTkVSOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NCX0xBQkVMOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElORTpcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSOlxyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCAmJiB0aGlzLlZhbHVlICE9IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VXJsKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0U6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TQl9JTUFHRTpcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQgJiYgdGhpcy5WYWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLnNldEltYWdlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1g6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkIHx8ICB0aGlzLmZvcmNlUmVmcmVzaClcclxuICAgICAgICAgICAgdGhpcy5zZXRDaGVja0JveFZhbHVlKGxpbmUsIG1nVmFsKTtcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTzpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1Q6XHJcbiAgICAgICAgICBzYXZlVmFsdWVDaGFuZ2VkID0gdmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZSwgdmFsdWVDaGFuZ2VkKTtcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgLy8gZml4ZWQgYnVnIzo3NzYyMTUsIDgwMDc2Myw5NDE4NDEsIHRoZSBwcmV2VmFsdWUgaXMgc2F2ZSBhcyBtZ3ZhbCBuZWVkIHRvIGNvbnZlcnQgdG8gbGF5ZXJcclxuICAgICAgICAgICAgbGV0IHByZXZEaXNwbGF5VmFsdWU6IG51bWJlcltdID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIEZpeCBidWcjOjc4NDM5MVxyXG4gICAgICAgICAgICAvLyBJZiBJdGVtTGlzdCB3YXMgdXBkYXRlIHJlZnJlc2hBbmRTZXRJdGVtTGlzdEJ5RGF0YVNvdXJjZSB0aGVuIHRoZSB2YWx1ZSBtdXN0IGJlIHNldFxyXG5cclxuICAgICAgICAgICAgaWYgKHNhdmVWYWx1ZUNoYW5nZWQgPT09IHZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgIGlmIChwcmV2VmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHByZXZEaXNwbGF5VmFsdWUgPSB0aGlzLmdldExheWVyRnJvbUxpbmtJZHgoYXdhaXQgdGhpcy5nZXRJbmRleE9mQ2hvaWNlKHByZXZWYWx1ZSwgbGluZSwgcHJldk51bGwpKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwcmV2RGlzcGxheVZhbHVlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChwcmV2RGlzcGxheVZhbHVlW2ldID09PSBHdWlDb25zdGFudHMuREVGQVVMVF9WQUxVRV9JTlQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2RGlzcGxheVZhbHVlW2ldID0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfTElTVF9WQUxVRTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaW5kaWNlID0gTWlzYy5HZXRJbnRBcnJheSh0aGlzLlZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGN1cnJlbnRMYXllciA9IHRoaXMuZ2V0Q3VycmVudExpbmtJZHgoKTtcclxuICAgICAgICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLlNlbGVjdGVkVmFsdWUsIGluZGljZVswXS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLlNlbGVjdGVkTGF5ZXIsIGN1cnJlbnRMYXllci50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKSkge1xyXG4gICAgICAgICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCBsaW5lLCBpbmRpY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgbGluZSwgK3RoaXMuVmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVDpcclxuICAgICAgICAgIGlmICh0aGlzLkhhc0F1dG9jb21wbGV0ZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtTGlzdEJ5RGF0YVNvdXJjZShsaW5lLCB2YWx1ZUNoYW5nZWQpO1xyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAvLyBpZiAoZm9ybS5mb3JtUmVmcmVzaGVkKCkgfHwgZm9yY2VSZWZyZXNoIHx8IHZhbEV4cCAhPSBudWxsICYmXHJcbiAgICAgICAgICAgIC8vIHZhbEV4cC5jb21wdXRlZEJ5Q2xpZW50T25seSgpKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNldEltYWdlV2l0aEZpbGVOYW1lKHRoaXMuVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLnNldFRleHQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU86XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtTGlzdEJ5RGF0YVNvdXJjZShsaW5lLCB2YWx1ZUNoYW5nZWQpO1xyXG4gICAgICAgICAgaWYgKCF2YWx1ZUNoYW5nZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIHRoaXMuc2V0UmFkaW9DaGVja2VkKHRoaXMuVmFsdWUpO1xyXG4gICAgICAgICAgLy8gc2V0UmFkaW9DaGVja2VkKHZhbHVlIC5sZW5ndGgoKSA9PSAwID8gREVGQVVMVF9WQUxVRV9JTlQgOiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7XHJcbiAgICAgICAgICAvLyBpZiAoIXRhc2suc3RhcnRQcm9jZXNzKCkpXHJcbiAgICAgICAgICAvLyBndWlNYW5hZ2VyLnNldEZvY3VzKHRoaXMpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIENvbnRyb2wuUmVmcmVzaERpc3BsYXlWYWx1ZSgpIHVua25vd24gdHlwZTogezB9XCIsIHRoaXMuVHlwZSkpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3VwZXIuaXNDaG9pY2VDb250cm9sKCkgJiYgdmFsdWVDaGFuZ2VkKVxyXG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUHJvcGVydHlMb2dpY05lc3RpbmcoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSwgYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgdHJ1ZSksIGZhbHNlKTtcclxuICAgIH0gY2F0Y2ggKGV4XzM2MCkge1xyXG4gICAgICBpZiAoZXhfMzYwIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBDb250cm9sLlJlZnJlc2hEaXNwbGF5VmFsdWUoKSBmb3IgY29udHJvbDogezB9XCIsIHRoaXMuTmFtZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleF8zNjA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShvbmx5UmVwZWF0YWJsZVByb3BzPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKG9ubHlSZXBlYXRhYmxlUHJvcHMpKVxyXG4gICAgICBvbmx5UmVwZWF0YWJsZVByb3BzID0gZmFsc2U7XHJcbiAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5XzEob25seVJlcGVhdGFibGVQcm9wcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlcyB0aGUgZGlzcGxheSBvZiB0aGUgY29udHJvbCBpbmNsdWRpbmcgaXRzIHZhbHVlIGFuZCBpdHMgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5UmVwZWF0YWJsZVByb3BzXCI+aWYgY29udHJvbCB0cmVlIC0gcmVmcmVzaGVzIG9ubHkgcmVwZWF0YWJsZSB0cmVlIHByb3BlcnRpZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgUmVmcmVzaERpc3BsYXlfMShvbmx5UmVwZWF0YWJsZVByb3BzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgLy8gIzQyMjI1MC4gU2tpcCB0aGUgcmVmcmVzaCBkaXNwbGF5IG9mIHRoZSBwYXJlbnQncyBzdWJmb3JtIGNvbnRyb2wgaWYgdGhlIGZvcm0gaW5zaWRlIGl0IGlzIHN0aWxsIGluIGl0cyBSZWZyZXNoRGlzcGxheS5cclxuICAgIGlmICghKHN1cGVyLmlzU3ViZm9ybSgpICYmIHRoaXMuR2V0U3ViZm9ybU1nRm9ybSgpICE9PSBudWxsICYmIHRoaXMuR2V0U3ViZm9ybU1nRm9ybSgpLmluUmVmcmVzaERpc3BsYXkoKSkpIHtcclxuXHJcbiAgICAgIC8vIHVwZGF0ZSB0aGUgcHJvcGVydGllc1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hQcm9wZXJ0aWVzKG9ubHlSZXBlYXRhYmxlUHJvcHMpO1xyXG5cclxuICAgICAgLy8gY29tcHV0ZSBhbmQgZGlzcGxheSB0aGUgdmFsdWUuXHJcbiAgICAgIGlmICh0aGlzLlNob3VsZENvbXB1dGVBbmRSZWZyZXNoT25DbG9zZWRGb3JtKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLkNvbXB1dGVBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZXhlY3V0ZXMgdGhlIHJlYWRvbmx5IGNvbW1hbmQgb25seSBpZiBuZWVkZWRcclxuICAgICAgbGV0IGlzUGFya2FibGVDdHJsOiBib29sZWFuID0gIShhd2FpdCB0aGlzLmlzUGFya2FibGUoZmFsc2UpKSB8fCAhIGF3YWl0IHRoaXMuaXNNb2RpZmlhYmxlKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5HZXRDdXJyUmVhZE9ubHkoKSAhPT0gaXNQYXJrYWJsZUN0cmwpIHtcclxuICAgICAgICB0aGlzLlNldEN1cnJSZWFkT25seShpc1BhcmthYmxlQ3RybCk7XHJcbiAgICAgICAgYXdhaXQgTWFuYWdlci5TZXRSZWFkT25seUNvbnRyb2wodGhpcywgaXNQYXJrYWJsZUN0cmwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbXVzdElucHV0UHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VU1RfSU5QVVQpO1xyXG4gICAgICAvLyBuZWVkIHRvIGNvbXB1dGUgYW5kIHJlZnJlc2ggdGhlIGRpc3BsYXkgaWYgdGhlIGNvbnRyb2wncyBkYXRhIGlzIGFuIGV4cHJlc3Npb25cclxuICAgICAgLy8gb3IgdGhlIGZvcm1hdCBpcyBleHByZXNzaW9uLiBXaGVuIHRoZSBmb3JtYXQgaXMgY2hhbmdlZCwgdGhlIGRpc3BsYXkgdmFsIG1heSBjaGFuZ2UgYXMgd2VsbC5cclxuICAgICAgaWYgKG11c3RJbnB1dFByb3BlcnR5ICE9IG51bGwgJiYgbXVzdElucHV0UHJvcGVydHkuaXNFeHByZXNzaW9uKCkpIHtcclxuXHJcbiAgICAgICAgbGV0IHByZXZNdXN0SW5wdXQ6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VU1RfSU5QVVQsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgaWYgKHByZXZNdXN0SW5wdXQgIT09IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VU1RfSU5QVVQsIGZhbHNlKSlcclxuICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLk11c3RJbnB1dCwgIXByZXZNdXN0SW5wdXQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX0lOLCB0cnVlKSlcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5UYWJJbmRleCwgLTEpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRm9yIFJpY2ggQ2xpZW50IGNvbXB1dGUgYW5kIHJlZnJlc2ggdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGFsd2F5cywgYWxzbyBpZiB0aGUgZm9ybSBpcyBub3QgeWV0IG9wZW5lZC5cclxuICAvLy8gRm9yIE9ubGluZSBvbmx5IGZvciBvcGVuZWQgZm9ybXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZENvbXB1dGVBbmRSZWZyZXNoT25DbG9zZWRGb3JtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFJlZnJlc2hlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgY29udHJvbC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9ubHlSZXBlYXRhYmxlUHJvcHNcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHJlZnJlc2hQcm9wZXJ0aWVzKG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwgJiYgdGhpcy5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FICYmIHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMpXHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX0FUVFJJQlVURSwgdGhpcywgdGhpcy5EYXRhVHlwZS5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICB0cnkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcykge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRQcm9wcygpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLlpvb21CdXR0b25Jbml0aWFsaXphdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5fcHJvcFRhYi5SZWZyZXNoRGlzcGxheShmYWxzZSwgb25seVJlcGVhdGFibGVQcm9wcykpKSB7XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIkNvbnRyb2wgJ3swfSc6IE5vdCBhbGwgcHJvcGVydGllcyBjb3VsZCBiZSBzZXRcIiwgdGhpcy5nZXROYW1lKCkpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICBpZiAoIW9ubHlSZXBlYXRhYmxlUHJvcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgIGxldCBtc2c6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihOU3RyaW5nLkZvcm1hdChcIkNvbnRyb2wgJ3swfSc6IHsxfVwiLCB0aGlzLmdldE5hbWUoKSwgZXguTWVzc2FnZSkpO1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2cobXNnLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaFRhYkZvckxheWVyTGlzdChsaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdXJyZW50TGlua1ZhbHVlOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIC8vIElmIHRoZSBmb3JtIGhhcyBhbHJlYWR5IG9wZW5lZCwgZ2V0IHRoZSBjdXJyZW50IGxpbmsgdmFsdWUgYmVmb3JlXHJcbiAgICAvLyBjaGFuZ2luZyB0aGUgbGF5ZXIgbGlzdCBpLmUuIGJlZm9yZSBjYWxsaW5nIHJlZnJlc2hBbmRTZXRJdGVtc0xpc3QoKS5cclxuICAgIC8vIEFuZCB0aGVuLCBhZnRlciBjaGFuZ2luZyB0aGUgbGF5ZXIgbGlzdCwgc2VsZWN0IHRoZSBUQUIgY29ycmVzcG9uZGluZ1xyXG4gICAgLy8gdG8gdGhlIGN1cnJlbnQgbGluayB2YWx1ZS5cclxuICAgIGlmICh0aGlzLmdldEZvcm0oKS5PcGVuZWQpIHtcclxuICAgICAgbGV0IGluZGljZTogbnVtYmVyW10gPSB0aGlzLmdldEN1cnJlbnRJbmRleE9mQ2hvaWNlKCk7XHJcbiAgICAgIGxldCBjdXJyZW50TGF5ZXI6IG51bWJlciA9IGluZGljZVswXTtcclxuICAgICAgY3VycmVudExpbmtWYWx1ZSA9IGF3YWl0IHRoaXMuZ2V0TGlua1ZhbHVlKGN1cnJlbnRMYXllci50b1N0cmluZygpLCBsaW5lKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lLCBmYWxzZSk7XHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkuT3BlbmVkKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShjdXJyZW50TGlua1ZhbHVlLCB0aGlzLklzTnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgaXRlbSBsaXN0IG9mIHJhZGlvIGJ1dHRvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPkRpc3BsYXkgbGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhlY0NvbXB1dGVDaG9pY2VcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHJlZnJlc2hBbmRTZXRJdGVtc0xpc3RGb3JSYWRpb0J1dHRvbihsaW5lOiBudW1iZXIsIGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgLy8gMS4gY3JlYXRlIHRoZSBidXR0b24gZm9yIGVhY2ggaXRlbXMgbGlzdFxyXG4gICAgbGV0IGRpc3BsYXlMaXN0OiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMucmVmcmVzaERpc3BSYW5nZShleGVjQ29tcHV0ZUNob2ljZSk7XHJcblxyXG4gICAgbGV0IG9wdGlvbnMgPSBkaXNwbGF5TGlzdC5tYXAoKGRpc3BsYXlWYWx1ZSwgY291bnRlcikgPT4ge1xyXG4gICAgICBsZXQgaW5kZXg6IHN0cmluZyA9IGNvdW50ZXIudG9TdHJpbmcoKTtcclxuICAgICAgcmV0dXJuIHtpbmRleCwgZGlzcGxheVZhbHVlfVxyXG4gICAgfSk7XHJcbiAgICAvLyBjcmVhdGVzIG5ldyByYWRpbyBidXR0b25zIGZyb20gZGlzcGxheSBsaXN0LlxyXG5cclxuICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgbGluZSwgSHRtbFByb3BlcnRpZXMuSXRlbXNMaXN0LCBvcHRpb25zKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgaXRlbSBsaXN0IGFuZCBzZXQgaXQgaW50byB0aGUgZ3VpIGNvbnRyb2wgaWYgaXQgaXMgY29tYm8gYm94ICwgcmVmcmVzaCBhbHNvIHRoZSB2aXNpYmxlXHJcbiAgLy8vICAgbGluZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZTogbnVtYmVyLCBleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGV4ZWNDb21wdXRlQ2hvaWNlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJSYW5nZShsaW5lKTtcclxuICAgIH1cclxuICAgIGxldCBvcHRpb25zU3RyaW5nczogc3RyaW5nW10gPSBhd2FpdCB0aGlzLnJlZnJlc2hEaXNwUmFuZ2UoZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG4gICAgaWYgKHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpIHx8IHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkpIHtcclxuXHJcbiAgICAgIGxldCBvcHRpb25zID0gb3B0aW9uc1N0cmluZ3MubWFwKChkaXNwbGF5VmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtpbmRleCwgZGlzcGxheVZhbHVlfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgbGluZSwgSHRtbFByb3BlcnRpZXMuSXRlbXNMaXN0LCBvcHRpb25zKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzUmFkaW8oKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1zTGlzdEZvclJhZGlvQnV0dG9uKGxpbmUsIGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGNob2ljZSBsaXN0IG9mIGEgU0VMRUNUIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hEaXNwUmFuZ2UoZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICBsZXQgc2VsZWN0Q21kOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDApO1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcblxyXG4gICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgIGxpbmUgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpIHtcclxuICAgICAgbGV0IGRhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuRGF0YVZpZXc7XHJcbiAgICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIGxldCBkaXNwVmFsczogc3RyaW5nW10gPSBhd2FpdCB0aGlzLmdldERpc3BWYWxzKGxpbmUsIGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9oYXNWYWxpZEl0bUFuZERpc3BWYWwpIHtcclxuICAgICAgICBzZWxlY3RDbWQgPSBNZ0NvbnRyb2xCYXNlLmNvbWJpbmVTdHJpbmdBcnJheXMoZGlzcFZhbHMsIGRjdi5nZXREaXNwVmFscygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNlbGVjdENtZCA9IGF3YWl0IHRoaXMuZ2V0RGlzcFZhbHMobGluZSwgZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmFuZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE9yZGVyZWREaXNwTGlzdChzZWxlY3RDbWQsIGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZWZyZXNoIHRoZSBpdGVtcyBsaXN0IG9mIHRoZSBzZWxlY3Rpb24gY29udHJvbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4ZWNDb21wdXRlQ2hvaWNlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIHJlZnJlc2hJdG1SYW5nZShleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuXHJcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3Igc2VsZWN0aW9uIGNvbnRyb2wuXHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSk7XHJcbiAgICBsZXQgb3JkZXJlZEl0bUxpc3Q6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMCk7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAoZXhlY0NvbXB1dGVDaG9pY2UpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG4gICAgfVxyXG4gICAgbGV0IGxpbmtWYWxzOiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgbGV0IGRhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuRGF0YVZpZXc7XHJcbiAgICBsZXQgZGN2OiBEY1ZhbHVlcyA9IGRhdGFWaWV3LmdldERjVmFsdWVzKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgaWYgKHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCkge1xyXG4gICAgICBvcmRlcmVkSXRtTGlzdCA9IE1nQ29udHJvbEJhc2UuY29tYmluZVN0cmluZ0FycmF5cyhsaW5rVmFscywgZGN2LkdldExpbmtWYWxzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE9yZGVyZWREaXNwTGlzdChvcmRlcmVkSXRtTGlzdCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgaXRlbXMgdmFsdWVzIGZyb20gZGF0YSBzb3VyY2UgJiBpdGVtIGxpc3QgcHJvcGVydHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldEl0ZW1zUmFuZ2UoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVmcmVzaEl0bVJhbmdlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBkaXNwbGF5IHZhbHVlcyBmcm9tIGRhdGEgc291cmNlICYgZGlzcGxheSBsaXN0IHByb3BlcnR5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXREaXNwbGF5UmFuZ2UoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVmcmVzaERpc3BSYW5nZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY3JlYXRlRGVmYXVsdFByb3BzKCkge1xyXG4gICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpO1xyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyM6NzgxNzQxXHJcbiAgICAvLyBpbiAxLjkgLS0+XHJcbiAgICAvLyB3aGVuIGFzayBhYm91dCBhbnkgcHJvcGVydHkoUFJPUF9UWVBFX0VOQUJMRUQpIHdlIHdhcyBjcmVhdGVkIHRoZSBkZWZhdWx0IHByb3BlcnR5IHdpdGggdGhlIGRlZmF1bHQgdmFsdWUodHJ1ZSkuXHJcbiAgICAvLyBhbmQgd2hlbiBnZXQgdG8gUmVmcmVzaFByb3BzIG9mIHRoZSBwcm9wZXJ0eSBcIlBST1BfVFlQRV9FTkFCTEVEXCIgd2Ugd2FzIGFkZCBjb21tYW5kIHRvIHRoZSBxdWV1ZSBpbiBndWkgdGhyZWFkXHJcbiAgICAvLyB0aGUgY29tbWFuZCB3YXMgd2FzIHVwZGF0ZSB0aGUgVGFnRGF0YS5FbmFibGUgdG8gYmUgXCJ0cnVlXCJcclxuICAgIC8vIGluIDIuMCAtLT5cclxuICAgIC8vIHdlIHVzZWluZyBhIG5ldyBtZXRob2QgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoKSB0aGF0IG5vdCBjcmVhdGVkIGFueSBkZWZhdWx0IHByb3BlcnR5IGFuZCBubyBnZXQgdG8gcmVmcmVzaFByb3BcclxuICAgIC8vIG9uIHRoZSBwcm9wZXJ0eSBhbmQgdGhlIHZhbHVlIG9uIHRoZSBDb250cm9sLkVuYWJsZSB3YXMgd3JvbmdcclxuICAgIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEKTtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0NST0xMX0JBUik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBMaW5rZWQgUGFyZW50IElkeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGlua2VkUGFyZW50RGl0SWR4XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldExpbmtlZFBhcmVudElkeChsaW5rZWRQYXJlbnREaXRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4ID0gbGlua2VkUGFyZW50RGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdmFsaWRhdGlvbiBkZXRhaWxzIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBidWlsZFBpY3R1cmUob2xkVmFsOiBhbnksIHZhbDogYW55KTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpIHx8IHN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcGljRXhwRXhpc3RzKSB7XHJcbiAgICAgIHRoaXMuX3ZkID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl92ZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl92ZCA9IG5ldyBWYWxpZGF0aW9uRGV0YWlscyhvbGRWYWwsIHZhbCwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdGhpcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fdmQuc2V0VmFsdWUodmFsKTtcclxuICAgICAgdGhpcy5fdmQuc2V0T2xkVmFsdWUob2xkVmFsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdmQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ2hlY2tzIGlmIHRoZSBzZW50IHZhbHVlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sJ3MgZXhpc3RpbmcgdmFsdWUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIk5ld1ZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNoZWNrTnVsbFZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRGlmZmVyZW50VmFsdWUobmV3VmFsdWU6IGFueSwgaXNOdWxsOiBib29sZWFuLCBjaGVja051bGxWYWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBjdHJsQ3VyclZhbHVlOiBhbnkgPSB0aGlzLlZhbHVlO1xyXG4gICAgbGV0IHZhbENoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUpXHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICF0aGlzLkNvbXBhcmVEYXRlKG5ld1ZhbHVlLCBjdHJsQ3VyclZhbHVlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhdGhpcy5Db21wYXJlVGltZShuZXdWYWx1ZSwgY3RybEN1cnJWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25DdHJsKCkgJiYgdHlwZW9mIGN0cmxDdXJyVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbGV0IG5ld1ZhbHVlc3RyID0gbmV3VmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gKG5ld1ZhbHVlc3RyICE9PSBjdHJsQ3VyclZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gKG5ld1ZhbHVlICE9PSBjdHJsQ3VyclZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uQ3RybCgpICYmIHR5cGVvZiBjdHJsQ3VyclZhbHVlID09PSAnc3RyaW5nJyAmJiBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkge1xyXG4gICAgICAgIGxldCBuZXdWYWx1ZVN0ciA9IG5ld1ZhbHVlLmpvaW4oJywnKS50b1N0cmluZygpO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhKFN0clV0aWwucnRyaW0obmV3VmFsdWVTdHIpID09PSBTdHJVdGlsLnJ0cmltKGN0cmxDdXJyVmFsdWUpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgY3RybEN1cnJJc051bGw6IGJvb2xlYW4gPSB0aGlzLklzTnVsbDtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIShTdHJVdGlsLnJ0cmltKG5ld1ZhbHVlKSA9PT0gU3RyVXRpbC5ydHJpbShjdHJsQ3VyclZhbHVlKSk7XHJcbiAgICAgICAgaWYgKCF2YWxDaGFuZ2VkICYmIGNoZWNrTnVsbFZhbHVlKSB7XHJcbiAgICAgICAgICB2YWxDaGFuZ2VkID0gKGlzTnVsbCAhPT0gY3RybEN1cnJJc051bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbENoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBDb21wYXJlRGF0ZShkMTogRGF0ZSwgZDI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIGxldCByZXR2YWw6IGJvb2xlYW47XHJcbiAgICBpZiAoZDEgPT09IG51bGwgJiYgZDIgPT09IG51bGwpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICgoZDEgPT09IG51bGwgJiYgZDIgIT09IG51bGwpIHx8IChkMSAhPT0gbnVsbCAmJiBkMiA9PT0gbnVsbCkpXHJcbiAgICAgIHJldHZhbCA9IGZhbHNlO1xyXG4gICAgZWxzZSBpZiAoZDEuZ2V0RnVsbFllYXIoKSA9PT0gZDIuZ2V0RnVsbFllYXIoKVxyXG4gICAgICAmJiBkMS5nZXREYXRlKCkgPT09IGQyLmdldERhdGUoKVxyXG4gICAgICAmJiBkMS5nZXRNb250aCgpID09PSBkMi5nZXRNb250aCgpKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHJldHZhbDtcclxuICB9XHJcblxyXG4gIENvbXBhcmVUaW1lKGQxOiBEYXRlLCBkMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldHZhbDogYm9vbGVhbjtcclxuICAgIGlmIChkMSA9PT0gbnVsbCAmJiBkMiA9PT0gbnVsbClcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKChkMSA9PT0gbnVsbCAmJiBkMiAhPT0gbnVsbCkgfHwgKGQxICE9PSBudWxsICYmIGQyID09PSBudWxsKSlcclxuICAgICAgcmV0dmFsID0gZmFsc2U7XHJcbiAgICBlbHNlIGlmIChkMS5nZXRIb3VycygpID09PSBkMi5nZXRIb3VycygpXHJcbiAgICAgICYmIGQxLmdldE1pbnV0ZXMoKSA9PT0gZDIuZ2V0TWludXRlcygpXHJcbiAgICAgICYmIGQxLmdldFNlY29uZHMoKSA9PT0gZDIuZ2V0U2Vjb25kcygpKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHJldHZhbDtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGNvbHVtbidzIHNvcnRhYmxlIHByb3BlcnR5IGlzIHNldCB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ29sdW1uU29ydGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNTb3J0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTiAmJiB0aGlzLl9wcm9wVGFiLnByb3BFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU09SVF9DT0xVTU4pKSB7XHJcbiAgICAgIGlzU29ydGFibGUgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU09SVF9DT0xVTU4pLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzU29ydGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBmaXJzdCBjaGlsZCBNZ0NvbnRyb2wgb2YgY29sdW1uIGkuZS4gZmllbGQgYXR0YWNoZWQgdG8gY29sdW1uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG5cclxuICBnZXRDb2x1bW5DaGlsZENvbnRyb2woKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBpZiAodGhpcy5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGxldCBsaW5rZWRDb250cm9sczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuX3BhcmVudFRhYmxlLmdldExpbmtlZENvbnRyb2xzKCk7XHJcblxyXG4gICAgcmV0dXJuIGxpbmtlZENvbnRyb2xzLmZpbmQoKGNvbnRyb2w6IE1nQ29udHJvbEJhc2UpID0+IChjb250cm9sLmdldExheWVyKCkgPT09IHRoaXMuZ2V0TGF5ZXIoKSAmJiBjb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTiAmJiAhY29udHJvbC5Jc1RhYmxlSGVhZGVyQ2hpbGQpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgY29udHJvbCBuYW1lIGZvciBoYW5kbGVyIHNlYXJjaCBwcm9wb3NlLlxyXG4gIC8vLyAgIFRoZSBjb250cm9sIGl0c2VsZiwgbWF5IG5vdCBoYXZlIGEgbmFtZSBmb3IgaGFuZGxlciBzZWFyY2ggKGxpa2UgY29sdW1uIGNvbnRyb2wsIGluIHdoaWNoIHdlIG5lZWQgdG8gdXNlXHJcbiAgLy8vICAgdGhlIGNoaWxkIGNvbnRyb2wgbmFtZSBmb3IgaGFuZGxlcnMgc2VhcmNoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb250cm9sTmFtZUZvckhhbmRsZXJTZWFyY2goKTogc3RyaW5nIHtcclxuICAgIGxldCBjaGlsZENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLmdldENvbHVtbkNoaWxkQ29udHJvbCgpO1xyXG4gICAgbGV0IG5hbWU6IHN0cmluZztcclxuICAgIGlmIChjaGlsZENvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGNoaWxkQ29udHJvbC5OYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2YgbGlua2VkIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGxpbmtDdHJsKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xpbmtlZENvbnRyb2xzLnB1c2goY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgY29udHJvbCBmcm9tIHRoZSBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVmRnJvbUZpZWxkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlJlbW92ZUNvbnRyb2wodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZGl0IGluZGV4IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREaXRJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldHMgZGNWYWxJZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGNWYWxJZFwiPjwvcGFyYW0+XHJcbiAgc2V0RGNWYWxJZChkY1ZhbElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RjVmFsSWQgPSBkY1ZhbElkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlmIHRoZSBwaWN0dXJlIGRlZmluZSBhcyBoZWJyZXcgdGhlbiBzZXQgdGhlIGxhbmcgdG8gaGVicmV3LCBvdGhlcndpc2UgcmVzdG9yZSB0aGUgbGFuZ1xyXG4gIC8vLyAgIFRoZSBzYW1lIHdlIGRvaW5nIGZvciBvbmxpbmUgOmVkdF9lZGl0LmNwcCA6IFNldEtleWJvYXJkTGFuZ3VhZ2UoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXN0b3JlTGFuZ1wiPjwvcGFyYW0+XHJcbiAgU2V0S2V5Ym9hcmRMYW5ndWFnZSgpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluaXRpYWxpemUgY29udHJvbCBwcm9wZXJ0aWVzIGZvciBkZXJpdmVkIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PihpbnRlcm5hbClcclxuICAvLy8gY2hlY2tzIGlmIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgSXNQYXJrYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmlzUGFya2FibGUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KGludGVybmFsKVxyXG4gIC8vLyBjaGVja3MgaWYgY29udHJvbCBoYXMgZXhwcmVzc2lvbiBvciBQYXJlbnQgdGFzayBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBIYXNFeHBPclBhcmVudFRhc2tGaWVsZCgpOiBib29sZWFuIHtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIHJldHVybiAodGhpcy5nZXRGaWVsZCgpID09PSBudWxsIHx8IHRoaXMuZ2V0RmllbGQoKS5nZXRUYXNrKCkgIT09IHRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja0VuYWJsZWRBbmRWaXNpYmxlXCI+Y2hlY2sgZW5hYmxlZCBhbmQgdmlzaWJsZSBwcm9wZXJ0aWVzIHRvbzwvcGFyYW0+XHJcbiAgYXN5bmMgaXNQYXJrYWJsZShjaGVja0VuYWJsZWRBbmRWaXNpYmxlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbjtcclxuICAgIHJlc3VsdCA9ICFzdXBlci5pc1RhYmxlQ29udHJvbCgpICYmICFzdXBlci5pc0NvbHVtbkNvbnRyb2woKTtcclxuXHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAvLyBub24gaW50ZXJhY3RpdmUgLT4gbm90IHBhcmthYmxlLlxyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXN1bHQgPSB0YXNrLklzSW50ZXJhY3RpdmU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdCAmJiB0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpICYmIHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuX2ZpZWxkLlBhcnRPZkRhdGF2aWV3KSB7XHJcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAvLyBRQ1IgIzQ0MTE3Ny4gV2hlbiB3ZSBjaGVjayB0aGUgc3ViZm9ybSBwYXJrIGFiaWxpdHksIHdlIG5lZWQgdG8gY2hlY2sgYWxzbyBpdCdzIHZpc2liaWxpdHkgYW5kIGVuYWJsZSBwcm9wZXJ0aWVzLlxyXG4gICAgICBpZiAoIXN1cGVyLmlzU3ViZm9ybSgpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSAoKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuX2ZpZWxkLmdldFRhc2soKSA9PT0gdGFzaykgfHwgdGhpcy5pc0J1dHRvbigpIHx8IHN1cGVyLmlzQnJvd3NlckNvbnRyb2woKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdCAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5pc1Zpc2libGUoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgocmVzdWx0ICYmIHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsKSAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpICYmIHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmFpc2UgQUNUX0NUUkxfSElUIG9uIGxlZnQgbW91c2UgY2xpY2sgaWYgaXQgbWVldHMgZm9sbG93aW5nIGNvbmRpdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmFpc2VDb250cm9sSGl0T25MZWZ0Q2xpY2tPZk1vdXNlRG93bigpOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICghc3VwZXIuSXNIeXBlclRleHRCdXR0b24oKSAmJiAhc3VwZXIuaXNSYWRpbygpICYmICFzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICByYWlzZUN0cmxIaXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhaXNlQ3RybEhpdDtcclxuICB9XHJcblxyXG4gIEdldFZhckluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgJ0NvbnRyb2wgSGl0JyBldmVudCBzaG91bGQgYmUgcmFpc2VkIG9uIG1vdXNlIGRvd24uXHJcbiAgLy8vIFRoZSBtZXRob2Qgd2FzIGV4dHJhY3RlZCBmcm9tIHByb2Nlc3NNb3VzZURvd24sIHNpbmNlIHdlIG1pZ2h0IGhhdmUgZGlmZmVyZW50XHJcbiAgLy8vIGJlaGF2aW9ycyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRyZWUgY29udHJvbHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZWZ0Q2xpY2tXYXNQcmVzc2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFJhaXNlQ29udHJvbEhpdE9uTW91c2VEb3duKGxlZnRDbGlja1dhc1ByZXNzZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChsZWZ0Q2xpY2tXYXNQcmVzc2VkKSB7XHJcbiAgICAgIGlmICh0aGlzLlJhaXNlQ29udHJvbEhpdE9uTGVmdENsaWNrT2ZNb3VzZURvd24oKSkge1xyXG4gICAgICAgIHJhaXNlQ3RybEhpdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByYWlzZUN0cmxIaXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZSBNR19BQ1RfSElUIG9uIHRoZSBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE9uU3ViZm9ybUNsaWNrKCk6IHZvaWQge1xyXG4gICAgTWFuYWdlci5FdmVudHNNYW5hZ2VyLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0hJVCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgTWdGb3JtIG9mIHRoZSBzdWJmb3JtIGNvbnRyb2wgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0U3ViZm9ybU1nRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUHJvcGVydHlFeGlzdHMoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhpZCk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IFwiICsgTWdDb250cm9sVHlwZVt0aGlzLlR5cGVdICsgXCJ9XCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyBpZiBuZXcgZGF0ZSBpcyAwPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+IFRoZSB2YWx1ZSB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNEYXRlWmVybyh2YWw6IERhdGUpIHtcclxuICAgIGxldCB6ZXJvRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgaWYgKHZhbC5nZXRNb250aCgpID09PSAwICYmIHZhbC5nZXRGdWxsWWVhcigpID09PSAwICYmIHZhbC5nZXREYXkoKSA9PT0gMClcclxuICAgICAgICB6ZXJvRGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gemVyb0RhdGU7XHJcbiAgfVxyXG5cclxuICBJc0RlZmF1bHRSb3V0ZXJPdXRsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSAmJiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9PVVRMRVQsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBJc1JvdXRlck91dGxldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNICYmIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVULCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgWm9vbUJ1dHRvbkluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaXNUZXh0Q29udHJvbCgpICYmIHRoaXMuY2hlY2tJZkV4aXN0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MKSlcclxuICAgIHtcclxuICAgICAgbGV0IGNvbm5lY3RlZEJ1dHRvbjogTWdDb250cm9sQmFzZSA9IHRoaXMuRm9ybS5DdHJsVGFiLkdldENvbnRyb2xCeUlzbigoYXdhaXQgKGF3YWl0IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MKSkuZ2V0VmFsdWVJbnQoKSkpO1xyXG5cclxuICAgICAgLy8gaW1hZ2UgYnV0dG9uIC0gY2FsY3VsYXRlIGFjY29yZGluZyB0byBpbWFnZVxyXG4gICAgICBsZXQgaW1hZ2VGaWxlTmFtZSA6IHN0cmluZyAgPSBudWxsO1xyXG4gICAgICBpZiAoY29ubmVjdGVkQnV0dG9uLklzSW1hZ2VCdXR0b24oKSAmJiBjb25uZWN0ZWRCdXR0b24uUHJvcGVydHlFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgaW1hZ2VGaWxlTmFtZSA9IGF3YWl0KGF3YWl0IGNvbm5lY3RlZEJ1dHRvbi5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FKSkuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoIU1pc2MuSXNXZWJVcmwoaW1hZ2VGaWxlTmFtZSkpXHJcbiAgICAgICAgICBpbWFnZUZpbGVOYW1lID0gXCIuL2Fzc2V0cy9pbWFnZXMvXCIgKyBpbWFnZUZpbGVOYW1lO1xyXG4gICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfU1RZTEUsIHRoaXMsIDAsIE1hZ2ljUHJvcGVydGllcy5JbWFnZUZpbGUsIGltYWdlRmlsZU5hbWUpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc3RvcmUgdGhlIGVkaXQgY29udHJvbCBvbiB0aGUgYnV0dG9uXHJcbiAgICAgIHRoaXMuQ29ubmVjdGVkQ29udHJvbCA9IGNvbm5lY3RlZEJ1dHRvbjtcclxuICAgICAgY29ubmVjdGVkQnV0dG9uLkNvbm5lY3RlZENvbnRyb2wgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
1874
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsRUFDbEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQVcsV0FBVyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQU1oRCxNQUFNLE9BQWdCLGFBQWMsU0FBUSx5QkFBeUI7SUE2RW5FLFlBQVksSUFBb0IsRUFBRSxZQUF5QixFQUFFLGFBQXNCO1FBQ2pGLEtBQUssRUFBRSxDQUFDO1FBekVWLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDWixvQkFBZSxHQUF3QixJQUFJLENBQUM7UUFDcEQsV0FBTSxHQUFpQixJQUFJLENBQUM7UUFDcEIsWUFBTyxHQUFXLElBQUksQ0FBQztRQUMvQixpQkFBWSxHQUFtQixJQUFJLENBQUM7UUFDcEMscUJBQWdCLEdBQW1CLElBQUksQ0FBQztRQUN4QyxpQkFBWSxHQUFtQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBcUIsSUFBSSxDQUFDO1FBQzdCLHFCQUFnQixHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQ25DLGlCQUFZLEdBQWlCLElBQUksQ0FBQztRQUMxQiw0QkFBdUIsR0FBWSxJQUFJLENBQUM7UUFDeEMsVUFBSyxHQUFlLElBQUksQ0FBQztRQUN6QiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsUUFBRyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFekIsd0JBQW1CLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDekMsb0JBQWUsR0FBbUIsSUFBSSxDQUFDO1FBQ3ZDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxTQUFJLEdBQVEsSUFBSSxDQUFDO1FBQ1Qsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDdkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQzNCLHNCQUFpQixHQUFXLElBQUksQ0FBQztRQUN6QyxnQkFBVyxHQUFpQixJQUFJLENBQUM7UUFDakMsYUFBUSxHQUFjLElBQUksQ0FBQztRQUNuQixXQUFNLEdBQVcsSUFBSSxDQUFDO1FBQ3RCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLFlBQU8sR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3hDLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFDZCxRQUFHLEdBQXNCLElBQUksQ0FBQztRQUM5QixhQUFRLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLDJCQUFzQixHQUFhLElBQUksQ0FBQztRQUN4Qyx5QkFBb0IsR0FBb0IsSUFBSSxDQUFDO1FBQzdDLHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUNyQyxhQUFRLEdBQXFCLGdCQUFnQixDQUFDLElBQUksQ0FBQztRQUNuRCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxVQUFLLEdBQVEsSUFBSSxDQUFDO1FBQ2xCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsaUJBQVksR0FBYSxLQUFLLENBQUM7UUFvQi9CLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFReEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFqQ0QsSUFBYyxJQUFJLENBQUMsS0FBaUI7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELElBQWMsSUFBSTtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFvQk8sYUFBYTtRQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxFQUFpQixDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBbUIsRUFBRSxZQUF3QixFQUFFLGFBQXFCO1FBQ3hGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFPRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksUUFBUSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELEtBQUssR0FBRyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQU1ELE9BQU8sQ0FBQyxNQUFjO1FBQ3BCLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBSWxELElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdCO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQU1ELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBTUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFjRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBYSxFQUFFLE9BQXlCLEVBQUUsTUFBYyxFQUFFLGtCQUEyQixFQUFFLFdBQTZCLEVBQUUsY0FBdUIsRUFBRSxZQUErQjtRQUNyTSxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEosQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQWE7UUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQVVELG1CQUFtQixDQUFDLE1BQWM7UUFDaEMsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNTyxjQUFjLENBQUMsTUFBa0I7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQU1ELFlBQVksQ0FBQyxpQkFBMEI7UUFDckMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLElBQUksaUJBQWlCLEVBQUU7WUFJckQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQ2hDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBTzlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQ2pDO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQztJQVVELEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBbUIsRUFBRSxJQUFZLEVBQUUsWUFBcUI7UUFDckUsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFNRCxZQUFZLENBQUMsT0FBZTtRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFNRCxtQkFBbUIsQ0FBQyxPQUFlO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQVFELFFBQVEsQ0FBQyxNQUFrQixFQUFFLE1BQWMsRUFBRSxNQUFpQjtRQUM1RCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7U0FDMUQ7UUFLRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNCO2FBQ0k7WUFHSCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDbkMsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3JDLEtBQUssYUFBYSxDQUFDLGdCQUFnQjtvQkFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUk7d0JBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO29CQUN6QyxNQUFNO2dCQUNSLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDbkMsS0FBSyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3BDLEtBQUssYUFBYSxDQUFDLGlCQUFpQixDQUFDO2dCQUNyQyxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7Z0JBQ25DLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO2dCQUN2QyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLEtBQUssYUFBYSxDQUFDLGNBQWM7b0JBQy9CLE1BQU07Z0JBQ1I7b0JBQ0UsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsNEVBQTRFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3BJLE1BQU07YUFDVDtTQUNGO1FBRUQsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRzNCLENBQUM7SUFPRCxnQkFBZ0IsQ0FBQyxZQUFvQixFQUFFLE1BQWlCO1FBQ3RELElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFHZixJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsV0FBVyxFQUFFO1lBQzdDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO2dCQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FFM0M7YUFDSSxJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsY0FBYztZQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzFCLElBQUksWUFBWSxLQUFLLGFBQWE7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCLElBQUksWUFBWSxLQUFLLEdBQUcsR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFO1lBQzNELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7YUFDSTtZQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHFGQUFxRixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDaEosT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQWlCO1FBQ3hDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLElBQUksU0FBUyxHQUFXLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzNELElBQUksb0JBQW9CLEdBQW9CLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBRWpELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFLTyxlQUFlLENBQUMsTUFBaUI7UUFDdkMsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFakYsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFHaEUsSUFBSSxHQUFHLEdBQVcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFcEcsSUFBSSxNQUFNLEdBQWlCLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQVE7WUFFdkgsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BELElBQUksU0FBUyxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLElBQUksUUFBUSxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUU5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN4QztZQUNELE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO2FBQ0k7WUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsNENBQTRDLENBQUMsQ0FBQztTQUMxRTtJQUNILENBQUM7SUFLRCxZQUFZLENBQUMsU0FBaUIsRUFBRSxRQUFnQjtRQUM5QyxJQUFJLGNBQWMsR0FBWSxJQUFJLENBQUM7UUFFbkMsUUFBUSxTQUFTLEVBQUU7WUFDakIsS0FBSyxZQUFZLENBQUMsWUFBWTtnQkFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFrQixDQUFDO2dCQUN6QyxNQUFNO1lBQ1IsS0FBSyxZQUFZLENBQUMsaUJBQWlCO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxxQkFBcUI7Z0JBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxpQkFBaUI7Z0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxNQUFNO1lBQ1IsS0FBSyxZQUFZLENBQUMsVUFBVTtnQkFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsS0FBSyxZQUFZLENBQUMsbUJBQW1CO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzlDLE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxnQkFBZ0I7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsTUFBTTtZQUNSLEtBQUssWUFBWSxDQUFDLHVCQUF1QjtnQkFFdkMsTUFBTTtZQUNSLEtBQUssWUFBWSxDQUFDLDRCQUE0QjtnQkFFNUMsTUFBTTtZQUNSO2dCQUNFLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLE1BQU07U0FDVDtRQUVELE9BQU8sY0FBYyxDQUFDO0lBRXhCLENBQUM7SUFJRCxRQUFRO1FBQ04sSUFBSSxNQUFNLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNsQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQ2I7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxFQUFFO1NBRzVDO2FBQ0k7WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsUUFBZ0I7UUFDbkMsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ3JCLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDZjtRQUNELFFBQVEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQzFCLFFBQVEsR0FBRyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7UUFFM0MsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDeEIsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3BHO2FBQ0k7WUFDSCxRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzFILFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzlGO0lBUUgsQ0FBQztJQU1PLFlBQVksQ0FBQyxZQUFvQjtRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO1FBQ3JDLElBQUksU0FBUyxHQUFrQixJQUFJLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsRUFBRTtZQUMxRSxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUMvQjtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFLRCxPQUFPO1FBS0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFNRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQU1ELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUlELGNBQWMsQ0FBQyxlQUF3QjtRQUNyQyxJQUFJLElBQUksR0FBVyxDQUFDLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFO1lBQ3BFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM5QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU1ELFNBQVM7UUFDUCxJQUFJLE1BQU0sR0FBWSxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdGLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNsRTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFNRCxZQUFZO1FBRVYsSUFBSSxVQUFVLEdBQVksSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRyxJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUM1RixJQUFJLGFBQWEsR0FBWSxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTdHLElBQUksTUFBTSxHQUFZLFVBQVUsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2pDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMxRztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxTQUFTO1FBQ1AsSUFBSSxRQUFRLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxHQUFHLEdBQWEsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7WUFDakMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDNUg7YUFDSTtZQUNILElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsR0FBRyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFNRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQWEsQ0FBQztRQUNsQixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QzthQUNJO1lBQ0gsSUFBSSxHQUFZLE9BQU8sQ0FBQztTQUN6QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU9ELGFBQWEsQ0FBQyxRQUFpQjtRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFHRCxNQUFNLENBQUMsTUFBYztRQUduQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2pIO2FBQ0k7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXhGLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQU1ELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUlELFNBQVM7UUFDUCxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9CLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN0RDthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QztTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUtELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQU1ELFFBQVEsQ0FBQyxpQkFBc0I7UUFDN0IsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLElBQUksaUJBQWlCLFlBQVksWUFBWSxFQUFFO1lBQzNFLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUdPLFVBQVUsQ0FBQyxLQUFtQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBTU8sVUFBVSxDQUFDLFVBQWtCO1FBQ25DLElBQUksV0FBVyxHQUFpQixJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEUsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLE9BQU87U0FDUjtRQUNELE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxtREFBbUQsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBT0QsU0FBUyxDQUFDLE1BQWMsRUFBRSxLQUFhO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQU1ELFFBQVEsQ0FBQyxRQUFnQjtRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0lBTUQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQU9ELGdCQUFnQixDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQzdDLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQztTQUNiO2FBQ0k7WUFDSCxJQUFJLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQixPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUtPLFdBQVc7UUFDakIsSUFBSSxNQUF5QixDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDckIsTUFBTSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0RjthQUNJO1lBQ0gsTUFBTSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUtELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUtELGNBQWMsQ0FBQyxNQUFXO1FBRXhCLElBQUksRUFBcUIsQ0FBQztRQUMxQixFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0MsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBR2QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFM0IsSUFBSSxHQUFHLEdBQVMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBS0QsUUFBUSxDQUFDLE1BQVc7UUFFbEIsSUFBSSxFQUFxQixDQUFDO1FBQzFCLElBQUksUUFBUSxHQUFZLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1FBRS9CLElBQUksRUFBRSxDQUFDLGdCQUFnQjtZQUNyQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7O1lBRXZCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFLTyxrQkFBa0IsQ0FBQyxRQUFnQjtRQUV6QyxJQUFJLFNBQVMsR0FBcUIsSUFBSSxRQUFRLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksVUFBVSxHQUFxQixJQUFJLFFBQVEsQ0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEUsSUFBSSxHQUFHLEdBQStCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDaEMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBTUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFNRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFPRCxVQUFVLENBQUMsWUFBb0I7UUFFN0IsSUFBSSxTQUFTLEdBQVcsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFHcEgsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxDQUFDLEVBQUU7WUFDOUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFNRCx1QkFBdUI7UUFDckIsSUFBSSxjQUFjLEdBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBDLElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxNQUFNLEdBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVEsQ0FBQztZQUM3QyxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xELEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRSxJQUFJLEdBQUcsR0FBVyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBTUQsMEJBQTBCO1FBQ3hCLE9BQU8sS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFNRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3hHLENBQUM7SUFNRCxrQkFBa0I7UUFDaEIsT0FBTyxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUU7SUFDdkcsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBU0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsTUFBZTtRQUdqRSxJQUFJLHVCQUF1QixHQUFZLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBRXpFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixJQUFJLGFBQWEsR0FBWSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7UUFDcEgsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDL0osQ0FBQztJQUdELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBWSxFQUFFLGlCQUEwQjtRQUN4RCxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUM7YUFDSTtZQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekM7SUFFSCxDQUFDO0lBTU8sV0FBVyxDQUFDLElBQVk7UUFDOUIsSUFBSSxLQUFLLEdBQWEsSUFBSSxLQUFLLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQU1PLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBWTtRQUN0QyxJQUFJLFFBQVEsR0FBYTtZQUN2QixNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUs7U0FDckIsQ0FBQztRQUNGLElBQUksTUFBTSxHQUFhO1lBQ3JCLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtTQUNqQixDQUFDO1FBQ0YsSUFBSSxJQUFJLEdBQWdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRCxJQUFJLFFBQVEsR0FBb0IsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QyxJQUFJLEdBQUcsR0FBYSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkMsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDO1FBQ2pDLElBQUksYUFBYSxHQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLFlBQVksR0FBWSxJQUFJLENBQUM7UUFDakMsSUFBSSxZQUFZLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxRQUFRLEdBQXFCLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0MsSUFBSSwrQkFBK0IsR0FBWSxLQUFLLENBQUM7UUFFckQsSUFBSTtZQUdGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2xHLElBQUksUUFBUSxLQUFLLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtvQkFDN0MsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDM0M7Z0JBQ0QsSUFBSSxRQUFRLEdBQWEsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLFFBQVEsR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLFFBQVEsR0FBYSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDckUsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO29CQUNyQixhQUFhLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzNDO2dCQUNELElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtvQkFDckIsYUFBYSxHQUFHLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUMzQztnQkFDRCxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN2RSxhQUFhLEdBQUcsRUFBRSxDQUFDO2lCQUNwQjtnQkFDRCxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ3BFLGFBQWEsR0FBRyxhQUFhLENBQUM7cUJBQy9CO3lCQUNJO3dCQUNILGFBQWEsR0FBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQztxQkFDdEM7b0JBQ0QsK0JBQStCLEdBQUcsSUFBSSxDQUFDO2lCQUN4QztnQkFDRCxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUN6QyxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQ3JFO2dCQUNELElBQUksT0FBTyxHQUFXLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRixJQUFJLElBQUksR0FBYSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxRQUFRLEdBQVcsQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxXQUFXLEdBQVcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3BGLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxXQUFXLEdBQVcsQ0FBQyxXQUFXLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakUsSUFBSSxRQUFRLEtBQUssV0FBVyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQy9DLGFBQWEsR0FBRyxhQUFhLENBQUM7b0JBQzlCLCtCQUErQixHQUFHLElBQUksQ0FBQztpQkFDeEM7Z0JBQ0QsSUFBSSxJQUFJLEdBQVcsUUFBUSxDQUFDO2dCQUM1QixJQUFJLFVBQVUsR0FBYSxJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxFQUFFO29CQUNySCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDNUQ7Z0JBR0QsSUFBSSxhQUFhLEdBQWEsV0FBVyxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDakksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLFVBQVUsR0FBYSxXQUFXLENBQUMsd0JBQXdCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDeEssSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQzVCLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQzFDO2dCQUdELElBQUksS0FBSyxHQUFXLElBQUksQ0FBQztnQkFDekIsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLFdBQTBCLENBQUM7Z0JBRS9CLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLE9BQU8sR0FBVyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDdkYsT0FBTyxHQUFHLE9BQU8sQ0FBQztvQkFDbEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUV4QyxJQUFJLE9BQU8sS0FBSyxPQUFPO3dCQUNyQixLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQzt5QkFDcEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3ZCLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDckM7eUJBQ0k7d0JBQ0gsS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUM3RCxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7cUJBQzVEO29CQUVELE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO29CQUV0QixRQUFRLFFBQVEsRUFBRTt3QkFDaEIsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7d0JBQzVCLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUMzQixLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQzt3QkFDOUIsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXOzRCQUMvQixLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDN0IsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ3JDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0NBQ2hDLFdBQVcsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dDQUNsQyxLQUFLLElBQUksUUFBUSxHQUFXLENBQUMsRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7b0NBQ3BFLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUk7d0NBQzlCLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7eUNBQ2pDLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3Q0FDeEMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FFNUIsS0FBSyxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs2QkFDaEM7NEJBQ0QsS0FBSyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQ3RELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0NBQy9DLEtBQUssR0FBRyxXQUFXLENBQUMseUJBQXlCLENBQUMsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs0QkFHMUUsSUFBSSxlQUFlLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxFQUFFO2dDQUNoRixJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFlBQVk7b0NBQ25FLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQzs2QkFDdEQ7aUNBQ0k7Z0NBQ0gsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxZQUFZO29DQUNwRCxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7NkJBQ3pDOzRCQUVELFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ3RCLE1BQU07d0JBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7d0JBQzlCLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUMzQixLQUFLLGdCQUFnQixDQUFDLElBQUk7NEJBQ3hCLElBQUksT0FBTyxHQUFRLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQy9FLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUN6QyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ2pCLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDOzRCQUNqRixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNyRSxNQUFNO3dCQUVSLEtBQUssZ0JBQWdCLENBQUMsT0FBTzs0QkFDM0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUNuQyxNQUFNO3dCQUVSOzRCQUNFLE1BQU07cUJBQ1Q7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLFlBQVk7b0JBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQjtTQUNGO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsWUFBWSxTQUFTLEVBQUU7Z0JBQzNCLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDbkY7O2dCQUVDLE1BQU0sRUFBRSxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsWUFBWSxDQUFDO0lBRzdDLENBQUM7SUFNRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUtPLE1BQU07UUFDWixRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBTUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFZO1FBQzNCLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQztRQUV6QixJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QixLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUM3QjthQUNJO1lBQ0gsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFFdEUsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFN0MsSUFBSSxJQUFJLEdBQUcsQ0FBQztvQkFDVixJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUVYLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtvQkFDN0IsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFL0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztvQkFDeEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBR3pDLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRTtvQkFDbEIsS0FBSyxHQUFHLE9BQU8sQ0FBQztpQkFDakI7cUJBQ0k7b0JBQ0gsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ2hEO2dCQUNELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtvQkFDbEIsSUFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO29CQUs1QixJQUFJLFFBQVEsR0FBcUIsSUFBSSxRQUFRLENBQVMsS0FBSyxDQUFDLENBQUM7b0JBQzdELElBQUksU0FBUyxHQUFzQixJQUFJLFFBQVEsQ0FBVSxNQUFNLENBQUMsQ0FBQztvQkFFakUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTt3QkFDeEIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7cUJBQ3hCO2lCQUNGO2FBQ0Y7aUJBQ0k7Z0JBQ0gsSUFBSSxlQUFlLEdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3BILEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQzthQUN2SDtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBUUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFzQixFQUFFLElBQVk7UUFDckQsSUFBSSxJQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBSSxJQUFJLEdBQWlCLElBQUksSUFBSSxFQUFVLENBQUM7UUFFNUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9CLElBQUksVUFBVSxHQUFhLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVELElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtZQUV2QixJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztTQUMxQjtRQUNELElBQUksVUFBVSxHQUFhLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFdEYsSUFBSSxNQUFNLEdBQWEsVUFBVSxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BELElBQUksR0FBRyxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ2YsSUFBSSxNQUFNLEdBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDNUM7aUJBQ0k7Z0JBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFO29CQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUM1QjtxQkFDSTtvQkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNqQjthQUNGO1NBQ0Y7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsV0FBVyxFQUFFO1lBQ2xELElBQUksVUFBVSxHQUFlLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzdELEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUM5RCxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQ3BGO1lBQ0QsTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNoQzthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7aUJBQ0k7Z0JBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0I7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFLTyxPQUFPO1FBQ2IsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLGtCQUFrQixHQUFRLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekMsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDcEIsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7WUFFeEYsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBa0IsY0FBYyxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBR3hJLENBQUM7SUFPTyxlQUFlLENBQUMsS0FBYTtRQUVuQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRixRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFHdkIsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLGlCQUFpQixFQUFFO1lBQzVDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUlELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUN2QztJQUNILENBQUM7SUFRTyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUNsRCxJQUFJLFVBQVUsR0FBWSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBT08sS0FBSyxDQUFDLGlDQUFpQyxDQUFDLElBQVksRUFBRSxZQUFxQjtRQUNqRixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1lBQzdCLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUd2QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDckI7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFRbkQsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDcEIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQU1ELFFBQVEsQ0FBQyxJQUFZO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBS0QsWUFBWSxDQUFDLEdBQVc7SUFFeEIsQ0FBQztJQVNELEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxNQUFjLEVBQUUsV0FBd0IsRUFBRSxHQUFZLEVBQUUsVUFBbUI7UUFJMUcsSUFBSSxVQUFVLEVBQUU7WUFFZCxRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDMUQsV0FBVyxLQUFLLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztTQUVwSTtRQUVELE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFZO1FBQ3JCLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekgsQ0FBQztJQVFELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsV0FBd0IsRUFBRSxHQUFZO1FBRWxGLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFJM0IsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUVsRSxJQUFJLEtBQUssR0FBa0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTVELElBQUksS0FBSyxDQUFDLHFCQUFxQixFQUFFO29CQUMvQixTQUFTO2dCQUVYLElBQUksVUFBVSxHQUFZLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUUzRSxVQUFVLEdBQUcsVUFBVSxJQUFJLEdBQUcsQ0FBQztnQkFFL0IsSUFBSSxtQkFBbUIsR0FBWSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXJFLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtvQkFFaEQsSUFBSSxVQUFVLEVBQUU7d0JBQ2QsVUFBVSxHQUFHLG1CQUFtQixDQUFDO3FCQUNsQztvQkFDRCxNQUFNLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUN0RTthQUNGO1lBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDdEU7U0FDRjtJQUNILENBQUM7SUFNRCxxQkFBcUIsQ0FBQyxPQUFxQjtRQUN6QyxJQUFJLFdBQVcsR0FBWSxLQUFLLENBQUM7UUFFakMsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3BCLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxJQUFJLE1BQU0sWUFBWSxhQUFhLEVBQUU7Z0JBQ25DLElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRTtvQkFDdEIsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDcEI7cUJBQ0k7b0JBS0gsSUFBSSxhQUFhLEdBQWtCLENBQUMsQ0FBQyxNQUFNLFlBQVksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFnQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0RyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUs7d0JBQ25LLFdBQVcsR0FBRyxJQUFJLENBQUM7O3dCQUVuQixXQUFXLEdBQUcsQ0FBaUIsTUFBTyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQzFFO2FBQ0Y7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFRRCw4QkFBOEIsQ0FBQyxNQUFjLEVBQUUsV0FBd0IsRUFBRSxHQUFZO0lBQ3JGLENBQUM7SUFRRCxxQkFBcUIsQ0FBQyxLQUFvQjtRQUN4QyxJQUFJLEdBQUcsR0FBWSxJQUFJLENBQUM7UUFFeEIsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxXQUFXLEdBQVcsQ0FBQyxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ3ZCLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDNUM7WUFDRCxJQUFJLEtBQUssR0FBVyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxXQUFXLEtBQUssS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBRXRDLEdBQUcsR0FBRyxLQUFLLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBTUQsaUJBQWlCO1FBQ2YsSUFBSSxXQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRTVCLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNyRCxJQUFJLGFBQWEsR0FBYSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUM3RCxJQUFJLGNBQWMsR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkUsV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFPRCxtQkFBbUIsQ0FBQyxNQUFnQjtRQUNsQyxJQUFJLE1BQU0sR0FBYSxJQUFJLEtBQUssQ0FBUyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEQsS0FBSyxJQUFJLElBQUksR0FBVyxDQUFDLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxHQUFHLEdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFbkIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO29CQUNaLElBQUksR0FBRyxDQUFDLENBQUM7aUJBQ1Y7Z0JBQ0QsSUFBSSxTQUFTLEdBQWEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUN4RDthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBT08sbUJBQW1CLENBQUMsTUFBZ0I7UUFDMUMsSUFBSSxVQUFVLEdBQWEsSUFBSSxLQUFLLENBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELEtBQUssSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ2hFLElBQUksS0FBSyxHQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQ2IsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDdEI7cUJBQ0k7b0JBQ0gsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO3dCQUNaLElBQUksR0FBRyxDQUFDLENBQUM7cUJBQ1Y7b0JBQ0QsSUFBSSxTQUFTLEdBQWEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRTt3QkFDaEgsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN4RDtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBUUQsaUJBQWlCLENBQUMsTUFBYztRQUM5QixJQUFJLE1BQU0sR0FBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxJQUFJLE1BQU0sR0FBaUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RSxJQUFJLE1BQWUsQ0FBQztRQUVwQixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFFbkIsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNmO2FBQ0k7WUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDcEQsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNoQjtpQkFDSTtnQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFO29CQUd2QyxNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUNoQjtxQkFDSTtvQkFFSCxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDdkg7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQU9ELGVBQWUsQ0FBQyxrQkFBMkI7UUFFekMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUNwRDthQUNJO1lBQ0gsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUMvQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDbkM7aUJBQ0k7Z0JBQ0gsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO0lBQ0gsQ0FBQztJQU1ELGVBQWUsQ0FBQyxNQUFlO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQU1ELGVBQWU7UUFDYixJQUFJLElBQUksR0FBVyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQWEsQ0FBQztRQUNsQixJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6QzthQUNJO1lBQ0gsSUFBSSxHQUFZLE9BQU8sQ0FBQztTQUN6QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQU1ELFFBQVE7UUFDTixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxHQUFHLEdBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QzthQUNJO1lBQ0gsSUFBSSxHQUFXLEdBQUcsQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtPLFlBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFTTyxhQUFhLENBQUMsTUFBYztRQUNsQyxJQUFJLE9BQU8sR0FBWSxJQUFJLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2pHLElBQUksVUFBVSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7WUFDMUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDNUIsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUNqQjtTQUNGO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQU9PLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxjQUF3QixFQUFFLElBQVk7UUFFckUsSUFBSSxjQUFjLEdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQUksWUFBWSxHQUFpQixJQUFJLElBQUksRUFBVSxDQUFDO1FBQ3BELElBQUksYUFBYSxHQUFpQixJQUFJLElBQUksRUFBVSxDQUFDO1FBQ3JELElBQUksU0FBUyxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFcEYsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQ3RCLGNBQWMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUM3QztRQUVELElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekUsY0FBYyxHQUFHLEVBQUUsQ0FBQztTQUNyQjtRQUNELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxTQUFTLEdBQWEsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxJQUFJLFlBQVksR0FBVyxDQUFDLENBQUMsQ0FBQztZQUM5QixLQUFLLElBQUksS0FBSyxHQUFXLENBQUMsRUFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDdkUsSUFBSSxnQkFBZ0IsR0FBVyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNyRCxJQUFJLGVBQWUsR0FBcUIsSUFBSSxRQUFRLENBQVMsWUFBWSxDQUFDLENBQUM7b0JBQzNFLElBQUksUUFBUSxHQUFZLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQzVFLFlBQVksR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO29CQUtyQyxJQUFJLFFBQVEsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFO3dCQUN6RSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQzdELGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztxQkFDdEM7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsSUFBSSxNQUFnQixDQUFDO1FBQ3JCLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsTUFBTSxHQUFHLGNBQWMsQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVEO2FBQ0k7WUFDSCxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQVMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELEtBQUssSUFBSSxHQUFHLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRztnQkFDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUVyQixNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUtELFlBQVk7UUFDVixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBS0Qsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQU1ELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFLRCxVQUFVLENBQUMsSUFBWTtRQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBTUQsc0JBQXNCO1FBQ3BCLElBQUksR0FBRyxHQUFZLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUU7Z0JBQ3JDLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDWjtpQkFJSTtnQkFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN2SCxHQUFHLEdBQUcsSUFBSSxDQUFDO2lCQUNaO2FBQ0Y7U0FDRjthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixHQUFHLEdBQUcsSUFBSSxDQUFDO2FBQ1o7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQU1ELHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQzVGLENBQUM7SUFRTyxNQUFNLENBQUMsbUJBQW1CLENBQUMsWUFBc0IsRUFBRSxXQUFxQjtRQUM5RSxJQUFJLE1BQU0sR0FBYSxJQUFJLEtBQUssRUFBVSxDQUFDO1FBRTNDLElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdkMsSUFBSSxXQUFXLEtBQUssSUFBSTtZQUN0QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBR0QsMEJBQTBCLENBQUMsTUFBYyxFQUFFLGFBQXNCLEVBQUUsSUFBYTtRQUM5RSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxFQUFFO1lBQ3JKLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNqRTtRQUNELE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQU9PLDRCQUE0QixDQUFDLE1BQWMsRUFBRSxhQUFzQjtRQUN6RSxJQUFJLE1BQU0sR0FBWSxhQUFhLENBQUM7UUFDcEMsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixNQUFNLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDekM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBU08sNEJBQTRCLENBQUMsTUFBYyxFQUFFLGFBQXNCLEVBQUUsSUFBWTtRQUN2RixJQUFJLE1BQU0sR0FBWSxhQUFhLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3ZFLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtvQkFDaEIsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUM7YUFDRjtTQUNGO2FBQ0k7WUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNqRTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFVRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBYyxFQUFFLGFBQXNCLEVBQUUsSUFBWTtRQUMxRSxJQUFJLE1BQU0sR0FBWSxhQUFhLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3ZFLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsR0FBVyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7b0JBQ2hCLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzFDO2FBQ0Y7U0FDRjthQUNJO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDdEQ7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBT0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFjLEVBQUUsYUFBc0I7UUFDcEQsSUFBSSxNQUFNLEdBQVksYUFBYSxDQUFDO1FBQ3BDLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN2QztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFPRCxvQkFBb0IsQ0FBQyxNQUFjO1FBQ2pDLElBQUksWUFBWSxHQUFZLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDOUMsSUFBSSxZQUFZLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDYjthQUNJO1lBQ0gsT0FBTyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDakU7SUFDSCxDQUFDO0lBT0QsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEtBQWEsRUFBRSxNQUFlO1FBQzVELElBQUksY0FBYyxHQUFZLElBQUksQ0FBQztRQUVuQyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFFaEIsSUFBSSxDQUFDLE1BQU07Z0JBQ1QsS0FBSyxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEQ7YUFDSTtZQUNILElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFO2dCQUMzQixJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7b0JBQ1osSUFBSSxHQUFHLENBQUMsQ0FBQztpQkFDVjtnQkFDRCxJQUFJLE1BQU0sR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQU1sRyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUN6QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNkLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM1RCxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTt3QkFDMUMsTUFBb0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztxQkFDMUc7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xELGNBQWMsR0FBRyxLQUFLLENBQUM7YUFDeEI7U0FDRjtRQUtELElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFO2dCQUNsRyxJQUFJO29CQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUU7d0JBQ2hHLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3FCQUNwQjt5QkFDSTt3QkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUN4TixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt5QkFDcEI7NkJBQ0k7NEJBQ0gsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQzs0QkFDeEMsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7eUJBQ2hLO3FCQUNGO29CQUdELElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7d0JBQ3hGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztxQkFDbkI7aUJBQ0Y7Z0JBQUMsT0FBTyxjQUFjLEVBQUU7b0JBQ3ZCLElBQUksY0FBYyxZQUFZLG9CQUFvQixFQUFFO3dCQUNsRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDckksSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7d0JBQ2hCLEtBQUssR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUN0RDs7d0JBRUMsTUFBTSxjQUFjLENBQUM7aUJBQ3hCO2FBQ0Y7aUJBQ0k7Z0JBQ0gsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBRS9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ3RCO1NBQ0Y7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ2hHLEtBQUssR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBSUQsb0JBQW9CLENBQUMsUUFBZ0I7UUFLbkMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFO1lBQ2pELElBQUksY0FBYyxHQUFZLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDMUMsSUFBSSxVQUFVLEdBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRzFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRTtvQkFDckMsVUFBVSxHQUFHLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDOUQ7YUFDRjtZQUNELElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1NBQ0Y7SUFDSCxDQUFDO0lBS08sVUFBVTtRQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ2hHLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUM7YUFDSTtZQUNILElBQUksa0JBQWtCLEdBQVcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFFOUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsRUFBRTtnQkFDMUMsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFHeEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFFdEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzVEO1lBR0QsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUM7U0FDRjtJQUNILENBQUM7SUFLTyxxQkFBcUI7UUFDM0IsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUdsRCxPQUFPLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDM0QsU0FBUyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBS0QsV0FBVyxDQUFDLEdBQVc7UUFDckIsSUFBSSxnQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO1lBQ25ELGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUN6QjtRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQU1ELDBCQUEwQjtRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFLRCxZQUFZLENBQUMsR0FBVztRQUN0QixJQUFJLE1BQWUsQ0FBQztRQUNwQixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDWixJQUFJLE1BQU0sR0FBYSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO2FBQ0k7WUFDSCxPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUlELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxZQUFxQjtRQUN2RCxJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLElBQUksWUFBcUIsQ0FBQztZQUMxQixJQUFJLGVBQWUsR0FBc0IsSUFBSSxRQUFRLENBQVUsWUFBWSxDQUFDLENBQUM7WUFFN0UsSUFBSSxNQUFNLEdBQ1IsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDekksWUFBWSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDckMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7YUFDL0Q7U0FDRjthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDeEIsSUFBSSxLQUFLLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO2dCQUM1QixJQUFJLFFBQVEsR0FBcUIsSUFBSSxRQUFRLENBQVMsS0FBSyxDQUFDLENBQUM7Z0JBQzdELElBQUksU0FBUyxHQUFzQixJQUFJLFFBQVEsQ0FBVSxNQUFNLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDNUYsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUN6QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDckQ7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtvQkFDdkQsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM1QzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBT0QsMkJBQTJCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtZQUNuSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuSCxDQUFDO0lBTUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQWE7UUFDckMsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLFlBQVksR0FBWSxJQUFJLENBQUM7UUFDakMsSUFBSSxnQkFBZ0IsR0FBWSxZQUFZLENBQUM7UUFFN0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ1osSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNWO1FBS0QsSUFBSTtZQUVGLElBQUksU0FBUyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksUUFBUSxHQUFZLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUU3QyxJQUFJLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDN0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO29CQUNuRCxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZFLFlBQVksR0FBRyxLQUFLLENBQUM7aUJBQ3RCO2dCQUVELElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQzVCLFlBQVksR0FBRyxJQUFJLENBQUM7aUJBQ3JCO2FBQ0Y7aUJBQ0k7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUM7b0JBQ2hFLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBRXZCLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxNQUFNO29CQUMxQixZQUFZLEdBQUcsSUFBSSxDQUFDO2FBRXZCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWhDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDakIsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO2dCQUNuQyxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDcEMsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO2dCQUNuQyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDckMsS0FBSyxhQUFhLENBQUMsZUFBZSxDQUFDO2dCQUNuQyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO2dCQUN2QyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDeEMsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3RDLEtBQUssYUFBYSxDQUFDLGNBQWM7b0JBQy9CLE9BQU87Z0JBRVQsS0FBSyxhQUFhLENBQUMsaUJBQWlCO29CQUNsQyxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7d0JBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsT0FBTztnQkFFVCxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQUM7Z0JBQ25DLEtBQUssYUFBYSxDQUFDLGtCQUFrQjtvQkFDbkMsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO3dCQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLE9BQU87Z0JBRVQsS0FBSyxhQUFhLENBQUMsa0JBQWtCO29CQUNuQyxJQUFJLFlBQVksSUFBSyxJQUFJLENBQUMsWUFBWTt3QkFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDckMsT0FBTztnQkFFVCxLQUFLLGFBQWEsQ0FBQyxhQUFhLENBQUM7Z0JBQ2pDLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztnQkFDbkMsS0FBSyxhQUFhLENBQUMsY0FBYztvQkFDL0IsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO29CQUNoQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNoRixJQUFJLFlBQVksRUFBRTt3QkFFaEIsSUFBSSxnQkFBZ0IsR0FBYSxJQUFJLENBQUM7d0JBS3RDLElBQUksZ0JBQWdCLEtBQUssWUFBWSxFQUFFOzRCQUNyQyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7Z0NBQ3RCLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BHLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7b0NBQzlELElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLGlCQUFpQixFQUFFO3dDQUMxRCxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUM7cUNBQ3ZEO2lDQUNGOzZCQUNGO3lCQUNGO3dCQUNELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUUxQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTs0QkFDdkIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7NEJBQzVDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzs0QkFDeEgsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3lCQUM1SDt3QkFFRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFOzRCQUNyQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3lCQUN0RTs7NEJBRUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDN0U7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDcEMsS0FBSyxhQUFhLENBQUMsY0FBYztvQkFDL0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO3dCQUN4QixNQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ25FLElBQUksWUFBWSxFQUFFO3dCQUdoQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTs0QkFDeEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDdkM7OzRCQUVDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDbEI7O3dCQUVDLE9BQU87b0JBQ1QsTUFBTTtnQkFFUixLQUFLLGFBQWEsQ0FBQyxlQUFlO29CQUNoQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNoRixJQUFJLENBQUMsWUFBWTt3QkFDZixPQUFPO29CQUNULElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUlqQyxNQUFNO2dCQUVSO29CQUNFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9EQUFvRCxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUM1RyxPQUFPO2FBQ1Y7WUFFRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxZQUFZO2dCQUN6QyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDNUs7UUFBQyxPQUFPLE1BQU0sRUFBRTtZQUNmLElBQUksTUFBTSxZQUFZLFNBQVMsRUFBRTtnQkFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsbURBQW1ELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDNUc7O2dCQUVDLE1BQU0sTUFBTSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQUMsbUJBQTZCO1FBQ2hELElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7WUFDeEMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQU1PLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBNEI7UUFHekQsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUU7WUFHMUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUdsRCxJQUFJLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxFQUFFO2dCQUM5QyxNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqRDtZQUdELElBQUksY0FBYyxHQUFZLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFFLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRTdGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLGNBQWMsRUFBRTtnQkFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDckMsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2FBQ3hEO1lBRUQsSUFBSSxpQkFBaUIsR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFHL0YsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLElBQUksaUJBQWlCLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBRWpFLElBQUksYUFBYSxHQUFZLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRXhHLElBQUksYUFBYSxLQUFLLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDO29CQUNuRixRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDdkk7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7Z0JBQ3hFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUUxSDtJQUNILENBQUM7SUFPRCxtQ0FBbUM7UUFDakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLG1CQUE0QjtRQUVsRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyx1QkFBdUI7WUFDakcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZGLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDMUIsSUFBSTtnQkFFRixJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7aUJBQ3pDO2dCQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUMsRUFBRTtvQkFDckUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0RBQWdELEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDOUc7Z0JBRUQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTt3QkFDeEIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztxQkFDdEM7aUJBQ0Y7YUFDRjtZQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxZQUFZLFNBQVMsRUFBRTtvQkFDM0IsSUFBSSxHQUFHLEdBQWtCLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUM3RyxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7aUJBQzVDOztvQkFFQyxNQUFNLEVBQUUsQ0FBQzthQUNaO1NBQ0Y7SUFDSCxDQUFDO0lBSUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQVk7UUFDdkMsSUFBSSxnQkFBZ0IsR0FBVyxJQUFJLENBQUM7UUFNcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ3pCLElBQUksTUFBTSxHQUFhLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3RELElBQUksWUFBWSxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUN6QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDO0lBT0QsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLElBQVksRUFBRSxpQkFBMEI7UUFHakYsSUFBSSxXQUFXLEdBQWEsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUzRSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3RELElBQUksS0FBSyxHQUFXLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBR0gsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFPRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBWSxFQUFFLGlCQUEwQjtRQUNuRSxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxJQUFJLGNBQWMsR0FBYSxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFFN0UsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdkQsT0FBTyxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQTtZQUM5QixDQUFDLENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUV4RzthQUNJO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzFFO1NBQ0Y7SUFDSCxDQUFDO0lBS0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGlCQUEwQjtRQUMvQyxJQUFJLFNBQVMsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTdDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDN0IsSUFBSSxRQUFRLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDbEUsSUFBSSxHQUFHLEdBQWEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEQsSUFBSSxRQUFRLEdBQWEsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRXpFLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUMvQixTQUFTLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUM1RTtTQUNGO2FBQ0k7WUFDSCxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQU9ELEtBQUssQ0FBQyxlQUFlLENBQUMsaUJBQTBCO1FBRzlDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFJLGNBQWMsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksaUJBQWlCLEVBQUU7WUFDckIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxRQUFRLEdBQWEsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxRQUFRLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxHQUFHLEdBQWEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsY0FBYyxHQUFHLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDakY7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBTUQsS0FBSyxDQUFDLGFBQWE7UUFDakIsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQU1ELEtBQUssQ0FBQyxlQUFlO1FBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQU1PLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBVTlDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUMsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFPTyxrQkFBa0IsQ0FBQyxrQkFBMEI7UUFDbkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0lBQ2hELENBQUM7SUFRRCxZQUFZLENBQUMsTUFBVyxFQUFFLEdBQVE7UUFFaEMsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNuRCxPQUFPLElBQUksQ0FBQztRQUVkLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdFO2FBQ0k7WUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QjtRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBU0QsZ0JBQWdCLENBQUMsUUFBYSxFQUFFLE1BQWUsRUFBRSxjQUF1QjtRQUV0RSxJQUFJLGFBQWEsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BDLElBQUksVUFBVSxHQUFZLEtBQUssQ0FBQztRQUVoQyxJQUFJLFFBQVEsWUFBWSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3pDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDOztnQkFFeEQsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDM0Q7UUFFRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFNBQVMsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO2dCQUMvRCxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLFVBQVUsR0FBRyxDQUFDLFdBQVcsS0FBSyxhQUFhLENBQUMsQ0FBQzthQUM5QztpQkFDSTtnQkFDSCxVQUFVLEdBQUcsQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDLENBQUM7YUFDM0M7U0FDRjthQUNJO1lBQ0gsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzFGLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hELFVBQVUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDN0U7aUJBQ0k7Z0JBQ0gsSUFBSSxjQUFjLEdBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLFVBQVUsSUFBSSxjQUFjLEVBQUU7b0JBQ2pDLFVBQVUsR0FBRyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsQ0FBQztpQkFDMUM7YUFDRjtTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFRLEVBQUUsRUFBUTtRQUM1QixJQUFJLE1BQWUsQ0FBQztRQUNwQixJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLElBQUk7WUFDNUIsTUFBTSxHQUFHLElBQUksQ0FBQzthQUNYLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQztZQUNuRSxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ1osSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRTtlQUN6QyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRTtlQUM3QixFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNsQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBUSxFQUFFLEVBQVE7UUFDNUIsSUFBSSxNQUFlLENBQUM7UUFDcEIsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQzVCLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUM7WUFDbkUsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNaLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUU7ZUFDbkMsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUU7ZUFDbkMsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUU7WUFDdEMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNoQixPQUFPLE1BQU0sQ0FBQztJQUVoQixDQUFDO0lBTUQsZ0JBQWdCO1FBQ2QsSUFBSSxVQUFVLEdBQVksS0FBSyxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDakgsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ3RHO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQU9ELHFCQUFxQjtRQUNuQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQjtZQUM5QyxPQUFPLElBQUksQ0FBQztRQUVkLElBQUksY0FBYyxHQUF3QixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFaEYsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNyTCxDQUFDO0lBUUQsOEJBQThCO1FBQzVCLElBQUksWUFBWSxHQUFrQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvRCxJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUU7WUFDekIsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDO1NBQzFCOztZQUVDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBTUQsUUFBUSxDQUFDLElBQW1CO1FBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFLRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFLRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFNRCxVQUFVLENBQUMsT0FBZTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBT0QsbUJBQW1CO1FBQ2pCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBS0QsSUFBSTtJQUNKLENBQUM7SUFNRCxLQUFLLENBQUMsVUFBVTtRQUNkLE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFNRCx1QkFBdUI7UUFDckIsSUFBSSxJQUFJLEdBQWdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQU1ELEtBQUssQ0FBQyxVQUFVLENBQUMsc0JBQStCO1FBRTlDLElBQUksTUFBZSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU3RCxJQUFJLElBQUksR0FBZ0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWpELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDN0I7UUFFRCxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO1lBQ25HLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLE1BQU0sRUFBRTtZQUVWLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQzthQUN0SDtZQUNELElBQUksTUFBTSxJQUFJLHNCQUFzQixFQUFFO2dCQUNwQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7YUFDakQ7WUFFRCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLElBQUksc0JBQXNCLEVBQUU7Z0JBQ3BFLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDdkw7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxxQ0FBcUM7UUFDbkMsSUFBSSxZQUFZLEdBQVksS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMzRSxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFVRCwwQkFBMEIsQ0FBQyxtQkFBNEI7UUFDckQsSUFBSSxZQUFZLEdBQVksS0FBSyxDQUFDO1FBQ2xDLElBQUksbUJBQW1CLEVBQUU7WUFDdkIsSUFBSSxJQUFJLENBQUMscUNBQXFDLEVBQUUsRUFBRTtnQkFDaEQsWUFBWSxHQUFHLElBQUksQ0FBQzthQUNyQjtTQUNGO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUtELGNBQWM7UUFDWixPQUFPLENBQUMsYUFBYSxDQUFDLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwSCxDQUFDO0lBS0QsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBT0QsY0FBYyxDQUFDLEVBQVU7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUM3RSxDQUFDO0lBSUQsVUFBVSxDQUFDLEdBQVM7UUFDbEIsSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDO1FBQzlCLElBQUksR0FBRyxZQUFZLElBQUksRUFBRTtZQUN2QixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztnQkFDdkUsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsYUFBYSxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDL0ksQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUNqRztZQUNFLElBQUksZUFBZSxHQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBR25LLElBQUksYUFBYSxHQUFhLElBQUksQ0FBQztZQUNuQyxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxlQUFlLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUM3RztnQkFDRSxhQUFhLEdBQUcsTUFBSyxDQUFDLE1BQU0sZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4RyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7b0JBQy9CLGFBQWEsR0FBRyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7Z0JBQ3BELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUUxRztZQUdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7WUFDeEMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUN6QztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgRGVidWcsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXIsXHJcbiAgaXNOdWxsT3JVbmRlZmluZWRcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7R3VpTWdDb250cm9sfSBmcm9tICcuLi8uLi9ndWkvR3VpTWdDb250cm9sJztcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tICcuLi8uLi9ndWkvUHJvcFBhcmVudEludGVyZmFjZSc7XHJcbmltcG9ydCB7R3VpRmllbGRCYXNlfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2hvaWNlVXRpbHMsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIE1hZ2ljUHJvcGVydGllcyxcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1pc2MsXHJcbiAgU0VRXzJfU1RSLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtNZ0Zvcm1CYXNlfSBmcm9tICcuL01nRm9ybUJhc2UnO1xyXG5pbXBvcnQge1BJQ30gZnJvbSAnLi9QSUMnO1xyXG5pbXBvcnQge1Byb3BUYWJsZX0gZnJvbSAnLi9Qcm9wVGFibGUnO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25EZXRhaWxzfSBmcm9tICcuL1ZhbGlkYXRpb25EZXRhaWxzJztcclxuaW1wb3J0IHtGaWVsZERlZn0gZnJvbSAnLi4vZGF0YS9GaWVsZERlZic7XHJcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gJy4vUHJvcGVydHknO1xyXG5pbXBvcnQge0d1aVRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9HdWlUYXNrQmFzZSc7XHJcbmltcG9ydCB7TWFuYWdlcn0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7Q29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7Q29tbWFuZHN9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSAnLi9Qcm9wSW50ZXJmYWNlJztcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7RGNWYWx1ZXMsIEVNUFRZX0RDUkVGfSBmcm9tICcuLi9kYXRhL0RjVmFsdWVzJztcclxuaW1wb3J0IHtHdWlEYXRhVmlld0Jhc2V9IGZyb20gJy4uL2RhdGEvR3VpRGF0YVZpZXdCYXNlJztcclxuaW1wb3J0IHtEaXNwbGF5Q29udmVydG9yfSBmcm9tICcuL0Rpc3BsYXlDb252ZXJ0b3InO1xyXG5pbXBvcnQge0Jsb2JUeXBlfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHtWZWN0b3JUeXBlfSBmcm9tICcuLi9kYXRhL1ZlY3RvclR5cGUnO1xyXG5pbXBvcnQge09iamVjdFJlZmVyZW5jZX0gZnJvbSAnLi4vLi4vdXRpbC9PYmplY3RSZWZlcmVuY2UnO1xyXG5pbXBvcnQge0d1aUNvbnN0YW50c30gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHtHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyfSBmcm9tICcuL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQge0ZvY3VzTWFuYWdlcn0gZnJvbSAnLi4vLi4vRm9jdXNNYW5hZ2VyJztcclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxjb250cm9sPiAuLi48L2NvbnRyb2w+IHRhZ1xyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWdDb250cm9sQmFzZSBleHRlbmRzIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgaW1wbGVtZW50cyBQcm9wUGFyZW50SW50ZXJmYWNlIHtcclxuXHJcbiAgLy8gZml4ZWQgZGVmZWN0ICM6ODE0OTgsIHdoaWxlIFJUIGlzIHNldCBkZWZhdWx0IHZhbHVlIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgY29udHJvbFxyXG4gIC8vIHRvIHRoZSB2YWx1ZSB3aWxsIHNldCB0byB0aGUgY29udHJvbFxyXG5cclxuICBfZGl0SWR4OiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2xpbmtlZENvbnRyb2xzOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gbnVsbDsgLy8gYXJyYXkgb2YgY29udHJvbHMgdGhhdCBhcmUgbGlua2VkIHRvIHRoaXMgY29udHJvbFxyXG4gIF9maWVsZDogR3VpRmllbGRCYXNlID0gbnVsbDsgLy8gcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBvZiB0aGUgY29udHJvbFxyXG4gIHByaXZhdGUgX3BpY1N0cjogc3RyaW5nID0gbnVsbDtcclxuICBfY2hvaWNlRGlzcHM6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gZm9yIFNFTEVDVCBjb250cm9scywgaG9sZHMgdGhlXHJcbiAgX2Nob2ljZUxheWVyTGlzdDogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyB0aGUgb3JkZXIgb24gd2hpY2ggdGFicyB0byBiZSBkaXNwbGF5ZWRcclxuICBfY2hvaWNlTGlua3M6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gZm9yIFNFTEVDVCBjb250cm9scywgaG9sZHMgdGhlXHJcbiAgX2Nob2ljZU51bXM6IExpc3Q8TlVNX1RZUEVbXT4gPSBudWxsOyAgLy8gZm9yIFNFTEVDVCBjb250cm9scywgd2l0aCBudW1lcmljXHJcbiAgcHJpdmF0ZSBfY29udGFpbmVyRGl0SWR4OiBudW1iZXIgPSAtMTtcclxuICBfY3VyclJlYWRPbmx5OiBMaXN0PGJvb2xlYW4+ID0gbnVsbDsgLy8gYSBoaXN0b3J5IGFycmF5IGZvciByZWFkb25seSBwYXJhbVxyXG4gIHByaXZhdGUgX2RhdGFDdHJsOiBib29sZWFuID0gZmFsc2U7IC8vIFRoZSBkYXRhIGNvbnRyb2wgZmxhZyBzdGF0ZXMgdGhhdCB0aGlzXHJcbiAgX2RjVGFibGVSZWZzOiBMaXN0PG51bWJlcj4gPSBudWxsOyAvLyByZWZlcmVuY2VzIHRvIGRjVmFscyBmb3IgZWFjaCBsaW5lIG9mIGEgY29udHJvbCBpcyBhIGRhdGEgY29udHJvbFxyXG4gIHByaXZhdGUgX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2Zvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSAtMTsgLy8gQ29udHJvbElzbiBvZiB0aGUgY29udHJvbCAoZm9yIHN1YmZvcm0pXHJcbiAgcHJpdmF0ZSBfY29udHJvbElzbjogbnVtYmVyID0gLTE7IC8vIGZvciBjdXJyZW50IGlzblxyXG5cclxuICBwcml2YXRlIF9saW5rZWRQYXJlbnREaXRJZHg6IG51bWJlciA9IC0xOyAvLyBub3QgdHJpZ2dlciBhbnkgZXZlbnQgaGFuZGxlciwgd2hpbGUgcGFya2luZyBpbiB0aGlzIGNvbnRyb2xcclxuICBfb3JnQ2hvaWNlRGlzcHM6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gZm9yIFRBQiBDb250cm9sIHNhdmUgdGhlIG9yZyBvcHRpb24gKHdpdGggdGhlICYpXHJcbiAgX3BhcmVudFRhYmxlOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDsgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBNYWdpYyBUYWJsZSBmb3JcclxuICBfcGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY0V4cEV4aXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9wcmV2SXNOdWxsczogTGlzdDxib29sZWFuPiA9IG51bGw7IC8vIGZvciBOVUxMXHJcbiAgcHJpdmF0ZSBfcHJldlBpY0V4cFJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICBfcHJldlZhbHVlczogTGlzdDxzdHJpbmc+ID0gbnVsbDsgLy8gcmVmZXJlbmNlcyB0byBwcmV2aW91cyB2YWx1ZXMgb2YgdGhlXHJcbiAgX3Byb3BUYWI6IFByb3BUYWJsZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmFuZ2U6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmFuZ2VDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7IC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIHRydWUgaWYgdGhlaXIgcmFuZ2VcclxuICBwcml2YXRlIF9ydGZWYWw6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7IC8vIGZpZWxkIHRvIHN0b3JlIHRoZSBydGYgdGV4dCBvZiByaWNoIGVkaXQgY29udHJvbFxyXG4gIF92YWxFeHBJZDogbnVtYmVyID0gMDsgLy8gcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBleHByZXNzaW9uXHJcbiAgcHJpdmF0ZSBfdmQ6IFZhbGlkYXRpb25EZXRhaWxzID0gbnVsbDtcclxuICBwcml2YXRlIF9kY1ZhbElkOiBudW1iZXIgPSAtMjtcclxuICBwYXJlbnQ6IG51bWJlciA9IDA7XHJcbiAgdmVlSW5keDogbnVtYmVyID0gMDtcclxuICBETk9iamVjdFJlZmVyZW5jZUZpZWxkOiBGaWVsZERlZiA9IG51bGw7XHJcbiAgU291cmNlVGFibGVSZWZlcmVuY2U6IE9iamVjdFJlZmVyZW5jZSA9IG51bGw7XHJcbiAgQ2xpcEJvYXJkRGF0YUV4aXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIERhdGFUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIEtleVN0cm9rZU9uOiBib29sZWFuID0gZmFsc2U7IC8vIHRydWUgaWYgdGhlIHVzZXIgcHJlc3NlZCBhIGtleVxyXG4gIE1vZGlmaWVkQnlVc2VyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgVmFsdWU6IGFueSA9IG51bGw7XHJcbiAgSXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZm9yY2VSZWZyZXNoIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzTW9kYWwgOiBib29sZWFuOyAvL2FwcGxpY2FibGUgZm9yIHN1YmZvcm0sIGlmIHN1YmZvcm0gaXMgTW9kYWxcclxuXHJcbiAgcHJvdGVjdGVkIHNldCBGb3JtKHZhbHVlOiBNZ0Zvcm1CYXNlKSB7XHJcbiAgICB0aGlzLl9mb3JtID0gdmFsdWU7XHJcbiAgICB0aGlzLkd1aU1nRm9ybSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zvcm07XHJcbiAgfVxyXG5cclxuICBnZXQgSWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIGdldCBDb250cm9sSXNuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbElzbjtcclxuICB9XHJcblxyXG4gIFJlZnJlc2hPblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSwgaWYgdGhlIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWQgb24gYmVjb21lIHZpc2libGVcclxuICBJbkNvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBWYWxpZGF0ZUNvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcm9tcHRIZWxwOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLyB0aGUgcHJvbXB0IGhlbHAgdGV4dCBhc3NpZ25lZCB0byBjb250cm9sXHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU/OiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm0/OiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sPzogbnVtYmVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMSh0eXBlLCBwYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2wpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbGlua2VkQ29udHJvbHMgPSBuZXcgTGlzdDxNZ0NvbnRyb2xCYXNlPigpO1xyXG4gICAgdGhpcy5EYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMSh0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLmluaXRSZWZlcmVuY2VzKHBhcmVudE1nRm9ybSk7XHJcbiAgICB0aGlzLlR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5fY29udGFpbmVyRGl0SWR4ID0gcGFyZW50Q29udHJvbDtcclxuICAgIHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCA9IHBhcmVudENvbnRyb2w7XHJcbiAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuICAgIHRoaXMuY3JlYXRlQXJyYXlzKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGdldCBVbmlxdWVOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRhc2tUYWcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm0uZ2V0VGFzaygpLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBjaGVja0lmRXhpc3RQcm9wKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBwcm9wQnlJZDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGV4aXN0ID0gKHByb3BCeUlkICE9PSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBleGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgSWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBnZXRQcm9wKHByb3BJZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsICdDJywgdGhpcyk7XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IHRoZW4gY3JlYXRlIGEgbmV3IHByb3BlcnR5IGFuZCBnaXZlIGl0IHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgLy8gaW4gYWRkaXRpb24gYWRkIHRoaXMgcHJvcGVydHkgdG8gdGhlIHByb3BlcnRpZXMgdGFibGVcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5fcHJvcFRhYi5hZGRQcm9wKHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZm9ybSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgaXMgZmlyc3QgcmVmcmVzaFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVVuaWNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhbHdheXNFdmFsdWF0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwid2FzRXZhbHVhdGVkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV2YWx1YXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlciwgY29udGVudFR5cGVVbmljb2RlOiBib29sZWFuLCByZXNDZWxsVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgYWx3YXlzRXZhbHVhdGU6IGJvb2xlYW4sIHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5FdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQsIHJlc1R5cGUsIGxlbmd0aCwgY29udGVudFR5cGVVbmljb2RlLCByZXNDZWxsVHlwZSwgYWx3YXlzRXZhbHVhdGUsIHdhc0V2YWx1YXRlZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogU3RvcmFnZUF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2wgdGhhdCBhbHJlYWR5IHdhcyBjb21wdXRlZFxyXG4gIC8vLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjcmVhdGUgYSBwcm9wZXJ0eSBpZiBpdCBpc24ndCBleGlzdC5cclxuICAvLy8gTWF5IHdlIG5lZWQgdG8gY3JlYXRlIGEgcHJvcGVydHkgYW5kIHVzZSBpdHMgZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gSW4gUGhhc2UgMiBpbiBSZWZyZXNoUHJvcGVydGllcyBtZXRob2Qgd2UnbGwgY3JlYXRlIGFuZCBjb21wdXRlIHByb3BlcnRpZXMsXHJcbiAgLy8vIHBlcmhhcHMgd2UgbmVlZCBjcmVhdGUgYWxsIHByb3BlcnRpZXMgbm90IG9ubHkgdGhvc2UgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gZGVmYXVsdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbml0aWFsaXppbmcgb2YgaW5uZXIgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj5yZWZlcmVuY2UgdG8gdGhlIHRhc2sgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdFJlZmVyZW5jZXMobWdGb3JtOiBNZ0Zvcm1CYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLkZvcm0gPSBtZ0Zvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW4gdGhlIGZpcnN0IHRpbWUgdGhhdCB3ZSByZWZyZXNoIHRoZSBjb250cm9sIG5lZWQgdG8gY3JlYXRlIGFycmF5c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZUNyZWF0ZUFycmF5c1wiPmNyZWF0ZSBhcnJheXMgaW4gYW55IGNhc2U8L3BhcmFtPlxyXG4gIGNyZWF0ZUFycmF5cyhmb3JjZUNyZWF0ZUFycmF5czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMgfHwgZm9yY2VDcmVhdGVBcnJheXMpIHtcclxuXHJcbiAgICAgIC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIGFsd2F5cyBpbml0aWFsaXplIERDIHRhYmxlIHNpbmNlIHdlIHVzZSBpdCB0byBtZXJnZSBjaG9pY2VzIGZyb20gdGhlXHJcbiAgICAgIC8vIHByb3AgbGlzdCB3aXRoIGNob2ljZXMgZnJvbSB0aGUgREFUQSBDT05UUk9MLlxyXG4gICAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICAgIHRoaXMuX2RjVGFibGVSZWZzID0gbmV3IExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzID0gbmV3IExpc3QoKTtcclxuXHJcbiAgICAgIC8vIFRoZSBwcm9wZXJ0eSBQUk9QX1NFVF9SRUFEX09OTFkgaXMgc2V0IG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBCeSBkZWZhdWx0XHJcbiAgICAgIC8vIHRoaXMgcHJvcGVydHkgaXMgZmFsc2UsIHNvIHdlIGRvIG5vdCBzZXQgaXQuXHJcbiAgICAgIC8vIEJ1dCBmb3IgdGhlIHBoYW50b20gdGFzayBpZiB0aGlzIHByb3BlcnR5IHdhcyB0cnVlLCBhbmQgd2UgZXhpdCB0aGUgcGhhbnRvbSBhbmQgYWdhaW4gZW50ZXIgaW50b1xyXG4gICAgICAvLyB0aGlzIHBoYW50b20gdGhlIHByb3BlcnR5IGJlY29tZXMgZmFsc2UuXHJcbiAgICAgIC8vIFNvIHdlIG5lZWQgdG8gc2F2ZSB0aGUgcHJldmlvdXMgX2N1cnJSZWFkT25seSB2YWx1ZSBmb3IgdGhlIHBoYW50b20gdGFzay5cclxuICAgICAgaWYgKCFmb3JjZUNyZWF0ZUFycmF5cykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWFkT25seSA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY2hvaWNlRGlzcHMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxpbmtzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTnVtcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGxzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0ID0gbmV3IExpc3QoKTtcclxuICAgICAgaWYgKCF0aGlzLklzUmVwZWF0YWJsZSAmJiAhc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJyYXlzKDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXRzIHRoZSBmb2N1cyBvbiB0aGUgY29udHJvbCBhbmQgcmVmcmVzaGVzIHByb21wdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj5Db250cm9sIHRvIGhhdmUgZm9jdXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj5saW5lIG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVmcmVzaFByb21wdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYWN0aXZhdGVGb3JtXCI+d2hldGhlciB0byBhY3RpdmF0ZSBhIGZvcm0gYWZ0ZXIgc2V0Zm9jdXMgb3Igbm90PC9wYXJhbT5cclxuICBhc3luYyBTZXRGb2N1cyhjdHJsOiBNZ0NvbnRyb2xCYXNlLCBsaW5lOiBudW1iZXIsIGFjdGl2YXRlRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSwgY3RybCwgbGluZSwgYWN0aXZhdGVGb3JtKTtcclxuICB9XHJcblxyXG4gIEluc2VydEFycmF5cyhpZHg6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcblxyXG4gICAgdGhpcy5fY3VyclJlYWRPbmx5Lkluc2VydFJhbmdlKG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5JbnNlcnRSYW5nZSggbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QuSW5zZXJ0UmFuZ2UoIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlTnVtcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKVxyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX3Byb3BUYWIuSW5zZXJ0UHJldlZhbHVlQXJyYXkoIGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgYXJyYXkncyBzaXplIGFjY29yZGluZyB0byB0aGUgbmV3U2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVBcnJheXMobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY3VyclJlYWRPbmx5LlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2Nob2ljZU51bXMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgIHRoaXMuX2RjVGFibGVSZWZzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcm9wVGFiLnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlUHJldlZhbEFycmF5cyhuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb3BUYWIudXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIHBhcnNlIGlucHV0IHN0cmluZyBhbmQgZmlsbCBpbm5lciBkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj50byBwYXJlbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXRpZHhcIj5udW1iZXIgb2YgdGhlIENvbnRyb2wgaW4gQ29udHJvbCBUYWJsZTwvcGFyYW0+XHJcbiAgZmlsbERhdGEobWdGb3JtOiBNZ0Zvcm1CYXNlLCBkaXRJZHg6IG51bWJlciwgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkZvcm0gPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5pbml0UmVmZXJlbmNlcyhtZ0Zvcm0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGl0SWR4ID0gZGl0SWR4O1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGRhdGF0eXBlIGlzIEJMT0IsIGl0cyBwaWN0dXJlIHdvdWxkIGJlIGJsYW5rLiBCdXQgYWZ0ZXIgdmVyc2lvbiAjOTdcclxuICAgIC8vIG9mIEFwcFNlcmlhbGl6ZXIuY3MgKGNoYW5nZWQgZm9yICM0ODU3MjIpLCBibGFuayBwaWN0dXJlIGlzIG5vdCBzZXJpYWxpemVkLlxyXG4gICAgLy8gU28sIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgdG8gYmxhbmsgaGVyZS5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgdGhpcy5fcGljU3RyID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fcGljU3RyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLkRhdGFUeXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgIHRoaXMuc2V0UElDKHRoaXMuX3BpY1N0cik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0U6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OOlxyXG4gICAgICAgICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSlcclxuICAgICAgICAgICAgdGhpcy5EYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0dST1VQOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfU0VUOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfRlJBTUVfRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTlRBSU5FUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJTkU6XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBDb250cm9sLmZpbGxEYXRhKCk6IG1pc3NpbmcgZGF0YXR5cGUgb3IgcGljdHVyZSBzdHJpbmcgZm9yIGNvbnRyb2w6IHswfVwiLCB0aGlzLk5hbWUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgdGhpcy5Gb3JtLnNldFRhYmxlQ3RybCh0aGlzKTtcclxuICAgIH1cclxuICAgIHRoaXMuY3JlYXRlQXJyYXlzKGZhbHNlKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPm5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gaWYgbmV4dCB0YWcgaXMgaW5uZXIgdGFnPC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCkge1xyXG4gICAgICBpZiAodGhpcy5fcHJvcFRhYiA9PT0gbnVsbClcclxuICAgICAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuXHJcbiAgICAgIHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ0MnLCBwYXJzZXIpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKVxyXG4gICAgICB0aGlzLnBhcnNlQXR0cmlidXRlcyhwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIlNvdXJjZVRhYmxlXCIpXHJcbiAgICAgIHRoaXMuUGFyc2VTb3VyY2VUYWJsZShwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIENvbnRyb2wuIEluc2VydCBlbHNlIGlmIHRvIENvbnRyb2wuaW5pdElubmVyT2JqZWN0cyBmb3IgezB9XCIsIGZvdW5kVGFnTmFtZSkpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFBhcnNlU291cmNlVGFibGUocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgIGxldCBvYmpSZWZTdHI6IHN0cmluZyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICBsZXQgc291cmNlVGFibGVSZWZlcmVuY2U6IE9iamVjdFJlZmVyZW5jZSA9IE9iamVjdFJlZmVyZW5jZS5Gcm9tWE1MKG9ialJlZlN0ci50cmltKCkpO1xyXG5cclxuICAgIHRoaXMuU291cmNlVGFibGVSZWZlcmVuY2UgPSBzb3VyY2VUYWJsZVJlZmVyZW5jZTtcclxuICAgIC8vIFNraXAgdGhlIGNsb3NpbmcgPC9wcm9wPiB0YWdcclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbnRyb2wgZnJvbSB0aGUgWE1MXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHBhcnNlQXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihcIj5cIiwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcblxyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTC5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pLyonXCInKi87XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSA9IGkgKyAyKSB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gdG9rZW5zLmdldF9JdGVtKGkgKyAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5TZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZVN0cik7XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgMSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIENvbnRyb2wuRmlsbE5hbWUoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHRoZSBjb250cm9sIGF0dHJpYnV0ZXMgaW4gcGFyc2luZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVFlQRTpcclxuICAgICAgICB0aGlzLlR5cGUgPSB2YWx1ZVN0clswXSBhcyBNZ0NvbnRyb2xUeXBlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0RBVEFfQ1RSTDpcclxuICAgICAgICB0aGlzLl9kYXRhQ3RybCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9MSU5LRURfUEFSRU5UOlxyXG4gICAgICAgIHRoaXMuc2V0TGlua2VkUGFyZW50SWR4KFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9DT05UQUlORVI6XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXIoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgIHRoaXMuX2lkID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVFJPTF9JU046XHJcbiAgICAgICAgdGhpcy5fY29udHJvbElzbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX01PREFMOlxyXG4gICAgICAgIHRoaXMuX2lzTW9kYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVFJPTF9aX09SREVSOlxyXG4gICAgICAgIC8vVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfSE9SX0FMSUdNRU5UX0lTX0lOSEVSSVRFRDpcclxuICAgICAgICAvL1RPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNUYWdQcm9jZXNzZWQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBzZXQgdGhlIGltYWdlIG9uIHRoZSBjb250cm9sIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWxlTmFtZVwiPjwvcGFyYW0+XHJcbiAgc2V0SW1hZ2UoKTogdm9pZCB7XHJcbiAgICBsZXQgbmV3VmFsOiBzdHJpbmcgPSB0aGlzLlZhbHVlO1xyXG4gICAgaWYgKG5ld1ZhbCA9PT0gbnVsbCB8fCB0aGlzLklzTnVsbCkge1xyXG4gICAgICBuZXdWYWwgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikge1xyXG4gICAgICAvLyBUT0RPIC0gY2hlY2sgaWYgc2hvdWxkIGJlIHN1cHBvcnRlZCAuXHJcbiAgICAgIC8vIENvbW1hbmRzLmFkZEFzeW5jKENvbW1hbmRUeXBlLlBST1BfU0VUX0lNQUdFX0RBVEEsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBCbG9iVHlwZS5nZXRCeXRlcyhuZXdWYWwpLCBwcm9wLmdldFZhbHVlSW50KCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0SW1hZ2VXaXRoRmlsZU5hbWUobmV3VmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEltYWdlV2l0aEZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChmaWxlTmFtZSA9PT0gbnVsbCkge1xyXG4gICAgICBmaWxlTmFtZSA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBmaWxlTmFtZSA9IEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZShmaWxlTmFtZSk7XHJcblxyXG4gICAgaWYgKCFNaXNjLklzV2ViVXJsKGZpbGVOYW1lKSlcclxuICAgICAgZmlsZU5hbWUgPSBcIi4vYXNzZXRzL2ltYWdlcy9cIiArIGZpbGVOYW1lO1xyXG5cclxuICAgIGlmICh0aGlzLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfU1RZTEUsIHRoaXMsIDAsIE1hZ2ljUHJvcGVydGllcy5JbWFnZUZpbGUsIGZpbGVOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5JbWFnZSwgZmlsZU5hbWUpO1xyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGZpbGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgdGhlIGxheW91dCBvbmx5IGlmIHRoZSByYWRpbyBpcyBub3Qgb24gdGFibGUuIGZvciB0YWJsZSwgaXQgaXMgZG9uZVxyXG4gICAgLy8gZnJvbSBMZ1JhZGlvQ29udGFpbmVyLnNldFNwZWNpZmljQ29udHJvbFByb3BlcnRpZXMoKS5cclxuXHJcbiAgICAvLyBpZiAoc3VwZXIuaXNSYWRpbygpICYmICF0aGlzLklzUmVwZWF0YWJsZSkge1xyXG4gICAgLy8gICBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5FWEVDVVRFX0xBWU9VVCwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGZhbHNlKTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBjb250YWluZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29udGFpbmVySWR4XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldENvbnRhaW5lcihjb250YWluZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29udGFpbmVyRGl0SWR4ID0gY29udGFpbmVySWR4O1xyXG4gICAgbGV0IGNvbnRhaW5lcjogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICBjb250YWluZXIgPSB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9jb250YWluZXJEaXRJZHgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb250YWluZXIgIT09IG51bGwgJiYgY29udGFpbmVyLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudFRhYmxlID0gY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jc1JlcGVhdGFibGUgPSAodGhpcy5fcGFyZW50VGFibGUgIT09IG51bGwgJiYgIXN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG5hbWUgb2YgdGhlIENvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIC8vIGlmICh0aGlzLmlzUmVwZWF0YWJsZSgpKSB7XHJcbiAgICAvLyAgIHJldHVybiBzdXBlci5nZXROYW1lKHRoaXMuRm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGlua2VkQ29udHJvbHMoKTogTGlzdDxNZ0NvbnRyb2xCYXNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGlua2VkQ29udHJvbHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhlIGNvbnRyb2wgaXMgcmVwZWF0YWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUmVwZWF0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLklzUmVwZWF0YWJsZTtcclxuICB9XHJcblxyXG4gIElzTW9kYWwoKSA6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybnMgY3VycmVudCBkaXNwbGF5IGxpbmUgb2YgY29udHJvbDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1c2VMaW5lRm9ySXRlbXNcIj5pZiB0cnVlLCB1c2UgY3VycmVudCBsaW5lIGZvciB0cmVlPC9wYXJhbT5cclxuICBnZXREaXNwbGF5TGluZSh1c2VMaW5lRm9ySXRlbXM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5Jc1JlcGVhdGFibGUgfHwgKHVzZUxpbmVGb3JJdGVtcyAmJiBzdXBlci5pc1RhYmxlQ29udHJvbCgpKSkge1xyXG4gICAgICBsaW5lID0gdGhpcy5Gb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxpbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIHZpc2liaWxpdHkgY29uc2lkZXJpbmcgcGFyZW50IHZpc2liaWxpdHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgdHJ1ZSk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuaXNQYXJlbnRQcm9wVmFsdWUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBlbmFibGVkIGNvbnNpZGVyaW5nIHBhcmVudCBlbmFibGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRyb2wgaXMgbW9kaWZpYWJsZSBhbmQgdGhlIHRhc2sgbW9kZSBpcyBub3QgcXVlcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTW9kaWZpYWJsZSgpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgbW9kaWZpYWJsZTogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZJQUJMRSwgdHJ1ZSk7XHJcbiAgICBsZXQgdGFza0luUXVlcnk6IGJvb2xlYW4gPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZO1xyXG4gICAgbGV0IG1vZGlmeUluUXVlcnk6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGWV9JTl9RVUVSWSwgZmFsc2UpO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBtb2RpZmlhYmxlICYmIChtb2RpZnlJblF1ZXJ5IHx8ICF0YXNrSW5RdWVyeSk7XHJcbiAgICBpZiAocmVzdWx0ICYmIHRoaXMuX2ZpZWxkICE9IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gKHRoaXMuX2ZpZWxkLkRiTW9kaWZpYWJsZSB8fCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGRjIHZhbHVlcyBvZiB0aGlzIGRhdGEgY29udHJvbCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGNWYWxzKCk6IERjVmFsdWVzIHtcclxuICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2RjVmFsSWQgPT09IEVNUFRZX0RDUkVGKSB7XHJcbiAgICAgIGRjdiA9ICgodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBkYXRhVmlldy5nZXRFbXB0eUNob2ljZUZvclZlY3RvcnMoKSA6IGRhdGFWaWV3LmdldEVtcHR5Q2hvaWNlKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9kY1ZhbElkID4gLTEpIHtcclxuICAgICAgICBkY3YgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRjdjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN1cnJlbnQgaXNOdWxsIGFjY29yZGluZyB0byB0aGUgY29udHJvbCdzIGN1cnJlbnQgbGluZSBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIFByZXZJc051bGwgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0UHJldklzTnVsbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IGN1cnJPYmo6IGFueSA9IHRoaXMuX3ByZXZJc051bGxzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgbGV0IGN1cnI6IGJvb2xlYW47XHJcbiAgICBpZiAoY3Vyck9iaiA9PT0gbnVsbCkge1xyXG4gICAgICBjdXJyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKGxpbmUsIGN1cnIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN1cnIgPSA8Ym9vbGVhbj5jdXJyT2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcHJldklzTnVsbCB2YWx1ZSBvZiB0aGUgcHJldklzTnVsbCBhcnJheVxyXG4gIC8vLyAgIHRoZSBuZXdWYWx1ZSBjYW4gYmUgTlVMTCBvciBib29sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPlxyXG4gIHNldFByZXZJc051bGwobmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSksIG5ld1ZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+PC9wYXJhbT5cclxuICBzZXRQSUMocGljU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBmb3IgcHVzaCBidXR0b24sIHRyYW5zbGF0ZSB0aGUgZm9ybWF0LlxyXG4gICAgaWYgKHN1cGVyLmlzQnV0dG9uKCkpIHtcclxuICAgICAgdGhpcy5fcGljU3RyID0gKHN1cGVyLklzSW1hZ2VCdXR0b24oKSA/IFwiXCIgKyBYTUxDb25zdGFudHMuRklMRV9OQU1FX1NJWkUudG9TdHJpbmcoKSA6IEV2ZW50cy5UcmFuc2xhdGUocGljU3RyKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fcGljU3RyID0gcGljU3RyO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGljID0gbmV3IFBJQyh0aGlzLl9waWNTdHIsIHRoaXMuRGF0YVR5cGUsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9kYXRhQ3RybCAmJiB0aGlzLl9waWNTdHIuaW5kZXhPZignSCcpID4gLTEpIHtcclxuICAgICAgdGhpcy5fcGljLnNldEhlYnJldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcGljdHVyZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBQSUMgcmVmZXJlbmNlPC9yZXR1cm5zPlxyXG4gIGdldFBJQygpOiBQSUMge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BpYztcclxuICB9XHJcblxyXG5cclxuLy8vIDxyZXR1cm5zPiB0aGUgcGFyZW50IG9mIHRoZSBjb250cm9sIGNhbiBiZSBUYWJsZVxcVGFiXFxDaG9pY2UgY29udHJvbFxcRm9ybTwvcmV0dXJucz5cclxuICBnZXRQYXJlbnQoKTogYW55IHtcclxuICAgIGxldCByZXRQYXJlbnQ6IGFueSA9IHRoaXMuRm9ybTtcclxuICAgIGlmICh0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xKSB7XHJcbiAgICAgIHJldFBhcmVudCA9IHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2NvbnRhaW5lckRpdElkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuRm9ybS5pc1N1YkZvcm0oKSkge1xyXG4gICAgICAgIHJldFBhcmVudCA9IHRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0UGFyZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpZWxkIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGaWVsZCgpOiBHdWlGaWVsZEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFNldCB0aGUgZmllbGQgb2YgdGhlIGNvbnRyb2wgYnkgdGhlIGZpZWxkIG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmaWVsZFwiPjwvcGFyYW0+XHJcbiAgc2V0RmllbGQoZmllbGRPckZpZWxkU3RySUQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGZpZWxkT3JGaWVsZFN0cklEID09PSBudWxsIHx8IGZpZWxkT3JGaWVsZFN0cklEIGluc3RhbmNlb2YgR3VpRmllbGRCYXNlKSB7XHJcbiAgICAgIHRoaXMuc2V0RmllbGRfMChmaWVsZE9yRmllbGRTdHJJRCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0RmllbGRfMShmaWVsZE9yRmllbGRTdHJJRCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWVsZF8wKGZpZWxkOiBHdWlGaWVsZEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpZWxkID0gZmllbGQ7XHJcbiAgICBpZiAoZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmllbGQuU2V0Q29udHJvbCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sIGJ5IGEgc3RyaW5nIGZpZWxkIGlkZW50aWZpZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj50aGUgZmllbGQgaWRlbnRpZmllcjogXCJwYXJlbnRJZCxmaWVsZElkeFwiL3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0RmllbGRfMShmaWVsZFN0cklEOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCByZXR1cm5GaWVsZDogR3VpRmllbGRCYXNlID0gdGhpcy5nZXRGaWVsZEJ5VmFsdWVTdHIoZmllbGRTdHJJRCk7XHJcbiAgICBpZiAocmV0dXJuRmllbGQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmllbGQgPSByZXR1cm5GaWVsZDtcclxuICAgICAgdGhpcy5fZmllbGQuU2V0Q29udHJvbCh0aGlzKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gQ29udHJvbC5zZXRGaWVsZCgpOiBpbGxlZ2FsIGZpZWxkIGlkZW50aWZpZXI6IFwiICsgZmllbGRTdHJJRCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBwaWN0dXJlIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1hdFwiPnRoZSBmb3JtYXQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV4cElkXCI+YW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybWF0PC9wYXJhbT5cclxuICBzZXRQaWNTdHIoZm9ybWF0OiBzdHJpbmcsIGV4cElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3BpY1N0ciA9IGZvcm1hdDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgdGhpcy5fcGljRXhwRXhpc3RzID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSByYW5nZSBvZiB0aGUgY29udHJvbCBhbmQgY2xlYXJzIHRoZSBtYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1JhbmdlXCI+aXMgdGhlIG5ldyByYW5nZTwvcGFyYW0+XHJcbiAgc2V0UmFuZ2UobmV3UmFuZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmFuZ2UgPSBuZXdSYW5nZTtcclxuICAgIHRoaXMuX3ZkID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXhwSWRcIj5hIHJlZmVyZW5jZSB0byB0aGUgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgc2V0VmFsRXhwKGV4cElkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZhbEV4cElkID0gZXhwSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGNvcHkgb2YgdmFsaWRhdGlvbiBkZXRhaWxzIHdpdGggbmV3ICYgb2xkIHZhbHVlIHdpdGhvdXQgY2hhbmdpbmcgcmVhbCB2YWxpZGF0aW9uIGRldGFpbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkVmFsXCI+dmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsXCI+dmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIGJ1aWxkQ29weVBpY3R1cmUob2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKTogVmFsaWRhdGlvbkRldGFpbHMge1xyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkgfHwgc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGNvcHlWRDogVmFsaWRhdGlvbkRldGFpbHMgPSB0aGlzLmdldENvcHlPZlZEKCk7XHJcbiAgICAgIGNvcHlWRC5zZXRWYWx1ZShuZXdWYWwpO1xyXG4gICAgICBjb3B5VkQuc2V0T2xkVmFsdWUob2xkVmFsKTtcclxuICAgICAgcmV0dXJuIGNvcHlWRDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBjb3B5IG9mIHZhbGlkYXRpb24gZGV0YWlscywgd2l0aG91dCBpbmZsdWVuY2UgdG8gdGhlIHJlYWwgdmFsaWRhdGlvbiBkZXRhaWxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldENvcHlPZlZEKCk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIGxldCByZXN1bHQ6IFZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgaWYgKHRoaXMuX3ZkID09PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uRGV0YWlscyh0aGlzLlZhbHVlLCB0aGlzLlZhbHVlLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0aGlzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHModGhpcy5fdmQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSYW5nZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9yYW5nZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmFuZ2VkIHZhbHVlIGZvciBpbnB1dCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmFuZ2VkVmFsdWUobmV3VmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICB2ZCA9IHRoaXMuYnVpbGRDb3B5UGljdHVyZSh0aGlzLlZhbHVlLCBuZXdWYWwpO1xyXG4gICAgdmQuZXZhbHVhdGUoKTtcclxuXHJcbiAgICAvLyB1c2VyIGhhcyBtb2RpZmllZCB2YWx1ZSwgc28gd2UgYXJlIGhlcmUgLi4uTW9kaWZpZWRCeVVzZXIgc2hvdWxkIGJlIHNldCB0byB0cnVlXHJcbiAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTtcclxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZHMgdmFsdWUgd2FzIHdyb25nXHJcbiAgICBsZXQgdmFsOiBhbnkgID0gdmQuZ2V0RGlzcFZhbHVlKClcclxuICAgIHJldHVybiAodmFsLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHZhbGlkYXRlIHVzZXIgaW5wdXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHZhbGlkYXRlKG5ld1ZhbDogYW55KTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgdmQ6IFZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgbGV0IG1vZGlmaWVkOiBib29sZWFuID0gdGhpcy5Nb2RpZmllZEJ5VXNlcjtcclxuICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgdmQgPSB0aGlzLmJ1aWxkQ29weVBpY3R1cmUodGhpcy5WYWx1ZSwgbmV3VmFsKTtcclxuICAgIHZkLmV2YWx1YXRlKCk7XHJcbiAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gbW9kaWZpZWQ7XHJcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRzIHZhbHVlIHdhcyB3cm9uZ1xyXG4gICAgaWYgKHZkLlZhbGlkYXRpb25GYWlsZWQpXHJcbiAgICAgIHJldHVybiB2ZC5FcnJvck1lc3NhZ2U7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZyk6IEd1aUZpZWxkQmFzZSB7XHJcblxyXG4gICAgbGV0IHJlZlBhcmVudDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KHRoaXMucGFyZW50KTtcclxuICAgIGxldCByZWZWZWVJbmR4OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4odGhpcy52ZWVJbmR4KTtcclxuICAgIGxldCByZXQ6IEd1aUZpZWxkQmFzZSA9IDxHdWlGaWVsZEJhc2U+dGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldEZpZWxkQnlWYWx1ZVN0cih2YWx1ZVN0ciwgcmVmUGFyZW50LCByZWZWZWVJbmR4KTtcclxuICAgIHRoaXMucGFyZW50ID0gcmVmUGFyZW50LnZhbHVlO1xyXG4gICAgdGhpcy52ZWVJbmR4ID0gcmVmVmVlSW5keC52YWx1ZTtcclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGhhcyBjb250YWluZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaGFzQ29udGFpbmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lckRpdElkeCAhPT0gLTE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyBsYXllciBvZiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExheWVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5MYXllcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlcyB0aGUgcGljIHVzaW5nIHRoZSByZXN1bHQgb2YgdGhlIGZvcm1hdCBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY0V4cFJlc3VsdFwiPnRoZSByZXN1bHQgb2YgdGhlIGZvcm1hdCBleHByZXNzaW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFBJQyByZWZlcmVuY2UgPC9yZXR1cm5zPlxyXG4gIGNvbXB1dGVQSUMocGljRXhwUmVzdWx0OiBzdHJpbmcpOiBQSUMge1xyXG4gICAgLy8gZm9yIHB1c2ggYnV0dG9uLCB0cmFuc2xhdGUgdGhlIGZvcm1hdC5cclxuICAgIGxldCBwaWNSZXN1bHQ6IHN0cmluZyA9IChwaWNFeHBSZXN1bHQgIT09IG51bGwgJiYgc3VwZXIuaXNCdXR0b24oKSkgPyBFdmVudHMuVHJhbnNsYXRlKHBpY0V4cFJlc3VsdCkgOiBwaWNFeHBSZXN1bHQ7XHJcblxyXG4gICAgLy8gY29uc3RydWN0IGEgbmV3IHBpY3R1cmUgb25seSBpZiB0aGUgZXhwcmVzc2lvbiByZXN1bHQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHByZXZpb3VzIHJlc3VsdFxyXG4gICAgaWYgKHRoaXMuX3ByZXZQaWNFeHBSZXN1bHQgPT09IG51bGwgfHwgISh0aGlzLl9wcmV2UGljRXhwUmVzdWx0ID09PSBwaWNSZXN1bHQpKSB7XHJcbiAgICAgIHRoaXMuX3BpYyA9IG5ldyBQSUMocGljUmVzdWx0LCB0aGlzLkRhdGFUeXBlLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgdGhpcy5fcHJldlBpY0V4cFJlc3VsdCA9IHBpY1Jlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9waWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldHMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNob2ljZSBpbiB0aGUgY2hvaWNlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5pbmRleCBvZiB0aGUgY3VycmVudCBjaG9pY2U8L3JldHVybnM+XHJcbiAgZ2V0Q3VycmVudEluZGV4T2ZDaG9pY2UoKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IHNlbGVjdGVkSW5kaWNlOiBudW1iZXJbXSA9IFstMV07XHJcblxyXG4gICAgbGV0IHZhbDogc3RyaW5nID0gdGhpcy5WYWx1ZTtcclxuXHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWwpKSB7XHJcbiAgICAgIGxldCBhcnJheTI6IHN0cmluZ1tdID0gdmFsLnNwbGl0KCcsJy8qJywnKi8pO1xyXG4gICAgICBzZWxlY3RlZEluZGljZSA9IG5ldyBBcnJheTxudW1iZXI+KGFycmF5Mi5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgYXJyYXkyLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgICAgbGV0IG51bTogbnVtYmVyID0gTk51bWJlci5QYXJzZShhcnJheTJbaUN0cl0pO1xyXG4gICAgICAgIHNlbGVjdGVkSW5kaWNlW2lDdHJdID0gKChudW0gPj0gMCkgPyBudW0gOiAtMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3RlZEluZGljZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0cnVlIGlzIG11bHRpIHNlbGVjdGlvbiBsaXN0IGJveCBlbHNlIGZhbHNlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBlci5pc0xpc3RCb3goKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0cnVlIGlmIGNvbnRyb2wgcGljdHVyZSBpcyBkYXRlIG9yIHRpbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSXNEYXRlVGltZVBpY3R1cmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGljLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IHRoaXMuX3BpYy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0aGlzIGNvbnRyb2wgc3VwcG9ydCBkYXRhIHNvdXJjZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTdXBwb3J0c0RhdGFTb3VyY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCkgfHwgc3VwZXIuaXNUYWJDb250cm9sKCkgfHwgc3VwZXIuaXNSYWRpbygpIHx8IHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkgO1xyXG4gIH1cclxuXHJcbiAgSGFzQXV0b2NvbXBsZXRlKCkge1xyXG4gICAgaWYgKHN1cGVyLmlzVGV4dENvbnRyb2woKSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX0NPTVBMRVRFX01PREVfV0MpLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGhlIGFycmF5IG9mIGluZGljZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIGxpbmsgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgcmVxdWVzdGVkIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzTnVsbFwiPnRydWUgaWYgbWdWYWwgcmVwcmVzZW50cyBhIG51bGwgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYXJyYXkgb2YgaW5kaWNlPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldEluZGV4T2ZDaG9pY2UobWdWYWw6IHN0cmluZywgbGluZTogbnVtYmVyLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XHJcblxyXG4gICAgLy8gaWYgdGhlIGNvbnRyb2wgaXMgbGlzdGJveCB3aXRoIHNpbmdsZSBzZWxlY3Rpb24gbW9kZSwgYW5kIHRoZSB2YWx1ZSBpcyBjb21tYSBzZXBhcmF0ZWQsIHRoZW4gd2Ugc2hvdWxkIG5vdCBzcGxpdCB2YWx1ZSBvbiBjb21tYS5cclxuICAgIGxldCBzcGxpdENvbW1hU2VwZXJhdGVkVmFsczogYm9vbGVhbiA9IHRoaXMuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcblxyXG4gICAgbGV0IGlzVmVjdG9yVmFsdWU6IGJvb2xlYW4gPSB0aGlzLmdldEZpZWxkKCkgIT09IG51bGwgJiYgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjtcclxuICAgIHJldHVybiB0aGlzLmdldERjVmFscygpLmdldEluZGV4T2YobWdWYWwsIGlzVmVjdG9yVmFsdWUsIGlzTnVsbCwgdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSksIHRoaXMuX2Nob2ljZU51bXMuZ2V0X0l0ZW0obGluZSksIHNwbGl0Q29tbWFTZXBlcmF0ZWRWYWxzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gcGFyc2VkIGNvbnRlbnQgb2YgUFJPUF9UWVBFX0RJU1BMQVlfTElTVDwvcmV0dXJucz5cclxuICBhc3luYyBnZXREaXNwVmFscyhsaW5lOiBudW1iZXIsIGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgaWYgKGV4ZWNDb21wdXRlQ2hvaWNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuICAgIH1cclxuICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fb3JnQ2hvaWNlRGlzcHMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2Nob2ljZURpc3BzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGVtcHR5Q2hvaWNlKGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHZhbHVlOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDApO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGlua3Muc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlcyB0aGUgY2hvaWNlcyBvZiBhIFNFTEVDVCBjb250cm9sIHRoYXQgb3JpZ2luYXRlIGZyb20gdGhlIGNvbnRyb2wncyBwcm9wZXJ0aWVzIChpbiBjb250cmFzdCB0b1xyXG4gIC8vLyAgIHRoZSBvbmVzIG9yaWdpbmF0aW5nIGZyb20gdGhlIHVuZGVybGF5aW5nIHRhYmxlIG9mIGEgZGF0YSBjb250cm9sKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlQ2hvaWNlKGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZyb21IZWxwOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJcXFxcXFxcXFwiLCBcIlxcXFwtXCIsIFwiXFxcXCxcIlxyXG4gICAgXTtcclxuICAgIGxldCB0b0hlbHA6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlhYXCIsIFwiWFhcIiwgXCJYWFwiXHJcbiAgICBdO1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGRhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSB0YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgIGxldCBjdXJyRGNJZDogbnVtYmVyID0gdGhpcy5nZXREY1JlZigpO1xyXG4gICAgbGV0IGNob2ljZURpc3BTdHI6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgY2hvaWNlTGlua1N0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBvcHRpb25zVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHRyaW1Ub0xlbmd0aDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZGF0YVR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLkRhdGFUeXBlO1xyXG4gICAgbGV0IGlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgLy8gcmUtY29tcHV0ZSB2YWx1ZXMgb25seSBpZiB0aGV5IGFyZSBub3QgdmFsaWQgb3IgdGhlIERDIHdhcyBjaGFuZ2VkIChkdWUgdG9IZWxwIHJlY29tcHV0ZSlcclxuICAgICAgaWYgKHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpID09PSBudWxsIHx8ICh0aGlzLmlzRGF0YUN0cmwoKSAmJiBjdXJyRGNJZCAhPT0gdGhpcy5fZGNWYWxJZCkpIHtcclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIGRhdGFUeXBlID0gdGhpcy5nZXRGaWVsZCgpLmdldENlbGxzVHlwZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZGlzcFZhbHM6IHN0cmluZ1tdID0gZGN2LmdldERpc3BWYWxzKCk7XHJcbiAgICAgICAgbGV0IGRpc3BQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1QpO1xyXG4gICAgICAgIGxldCBsaW5rUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpO1xyXG4gICAgICAgIGlmIChkaXNwUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGF3YWl0IGRpc3BQcm9wLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaW5rUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY2hvaWNlTGlua1N0ciA9IGF3YWl0IGxpbmtQcm9wLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaG9pY2VMaW5rU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlTGlua1N0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNob2ljZURpc3BTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VEaXNwU3RyKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGlmICghdGhpcy5pc0RhdGFDdHJsKCkgfHwgZGlzcFZhbHMgPT09IG51bGwgfHwgZGlzcFZhbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNob2ljZURpc3BTdHIgPSBjaG9pY2VMaW5rU3RyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNob2ljZURpc3BTdHIgPSAoY2hvaWNlTGlua1N0ciA9IFwiXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNob2ljZURpc3BTdHIgPSBFdmVudHMuVHJhbnNsYXRlKGNob2ljZURpc3BTdHIpO1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZUxpbmtTdHIsIFwiXFxcXC1cIiwgXCItXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVscFN0cjogc3RyaW5nID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZUxpbmtTdHIsIGZyb21IZWxwLCB0b0hlbHApO1xyXG4gICAgICAgIGxldCBzVG9rOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoaGVscFN0ciwgXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaW5rU2l6ZTogbnVtYmVyID0gKGhlbHBTdHIgIT09IFwiXCIpID8gc1Rvay5sZW5ndGggOiAwO1xyXG4gICAgICAgIGxldCBoZWxwU3RyRGlzcDogc3RyaW5nID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZURpc3BTdHIsIGZyb21IZWxwLCB0b0hlbHApO1xyXG4gICAgICAgIHNUb2sgPSBTdHJVdGlsLnRva2VuaXplKGhlbHBTdHJEaXNwLCBcIixcIik7XHJcbiAgICAgICAgbGV0IGRpc3BsYXlTaXplOiBudW1iZXIgPSAoaGVscFN0ckRpc3AgIT09IFwiXCIpID8gc1Rvay5sZW5ndGggOiAwO1xyXG5cclxuICAgICAgICBpZiAobGlua1NpemUgIT09IGRpc3BsYXlTaXplICYmIGRpc3BsYXlTaXplID4gMCkge1xyXG4gICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGNob2ljZUxpbmtTdHI7XHJcbiAgICAgICAgICBpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlciA9IGxpbmtTaXplO1xyXG4gICAgICAgIGxldCBjaG9pY2VMaW5rOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KHNpemUpO1xyXG4gICAgICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIGNob2ljZUxpbmspO1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICAgICAgdGhpcy5fY2hvaWNlTnVtcy5zZXRfSXRlbShsaW5lLCBuZXcgQXJyYXk8TlVNX1RZUEU+KHNpemUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCBkaXNwbGF5IHZhbHVlc1xyXG4gICAgICAgIGxldCBvcmdDaG9pY2VEaXNwOiBzdHJpbmdbXSA9IENob2ljZVV0aWxzLkdldERpc3BsYXlMaXN0RnJvbVN0cmluZyhjaG9pY2VEaXNwU3RyLCBmYWxzZSwgdHJ1ZSwgIWlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QpO1xyXG4gICAgICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIG9yZ0Nob2ljZURpc3ApO1xyXG4gICAgICAgIGxldCBjaG9pY2VEaXNwOiBzdHJpbmdbXSA9IENob2ljZVV0aWxzLkdldERpc3BsYXlMaXN0RnJvbVN0cmluZyhjaG9pY2VEaXNwU3RyLCBzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSwgdHJ1ZSwgIWlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QpO1xyXG4gICAgICAgIHRoaXMuX2Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIGNob2ljZURpc3ApO1xyXG4gICAgICAgIGlmICh0aGlzLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRyaW1Ub0xlbmd0aCA9IHRoaXMuZ2V0RmllbGQoKS5nZXRTaXplKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbGV0IHRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGxldCBoZWxwVG9rZW46IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbGV0IHRva2VuQnVmZmVyOiBTdHJpbmdCdWlsZGVyO1xyXG4gICAgICAgIC8vIEFkZCBsaW5rIHZhbHVlcy5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBjdXJyUG9zOiBudW1iZXIgPSAwLCBuZXh0UG9zID0gMDsgaSA8IHNpemUgJiYgb3B0aW9uc1ZhbGlkOyBpKyspIHtcclxuICAgICAgICAgIG5leHRQb3MgPSBjdXJyUG9zO1xyXG4gICAgICAgICAgbmV4dFBvcyA9IGhlbHBTdHIuaW5kZXhPZignLCcsIG5leHRQb3MpO1xyXG5cclxuICAgICAgICAgIGlmIChuZXh0UG9zID09PSBjdXJyUG9zKVxyXG4gICAgICAgICAgICB0b2tlbiA9IGhlbHBUb2tlbiA9IFwiXCI7XHJcbiAgICAgICAgICBlbHNlIGlmIChuZXh0UG9zID09PSAtMSkge1xyXG4gICAgICAgICAgICB0b2tlbiA9IGNob2ljZUxpbmtTdHIuc3Vic3RyKGN1cnJQb3MpO1xyXG4gICAgICAgICAgICBoZWxwVG9rZW4gPSBoZWxwU3RyLnN1YnN0cihjdXJyUG9zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0b2tlbiA9IGNob2ljZUxpbmtTdHIuc3Vic3RyKGN1cnJQb3MsIChuZXh0UG9zKSAtIChjdXJyUG9zKSk7XHJcbiAgICAgICAgICAgIGhlbHBUb2tlbiA9IGhlbHBTdHIuc3Vic3RyKGN1cnJQb3MsIChuZXh0UG9zKSAtIChjdXJyUG9zKSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY3VyclBvcyA9IG5leHRQb3MgKyAxO1xyXG5cclxuICAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTzpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICAgICAgICB0b2tlbiA9IFN0clV0aWwubHRyaW0odG9rZW4pO1xyXG4gICAgICAgICAgICAgIGhlbHBUb2tlbiA9IFN0clV0aWwubHRyaW0oaGVscFRva2VuKTtcclxuICAgICAgICAgICAgICBpZiAoaGVscFRva2VuLmluZGV4T2YoJ1xcXFwnKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0b2tlblBvczogbnVtYmVyID0gMDsgdG9rZW5Qb3MgPCBoZWxwVG9rZW4ubGVuZ3RoOyB0b2tlblBvcysrKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoaGVscFRva2VuW3Rva2VuUG9zXSAhPT0gJ1xcXFwnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRva2VuQnVmZmVyLkFwcGVuZCh0b2tlblt0b2tlblBvc10pO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlblBvcyA9PT0gaGVscFRva2VuLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5CdWZmZXIuQXBwZW5kKCcgJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbkJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0b2tlbiA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0b2tlbiwgU0VRXzJfU1RSKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSB8fCB0aGlzLmlzVGFiQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgdG9rZW4gPSBDaG9pY2VVdGlscy5SZW1vdmVBY2NsQ2hhckZyb21PcHRpb25zKG5ldyBTdHJpbmdCdWlsZGVyKHRva2VuKSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGNob2ljZUxpbmsgc2l6ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHNpemUgb2YgdGhlIGZpZWxkLCBzbyB0cmltIGl0LlxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpbVRvTGVuZ3RoICE9PSAtMSAmJiBVdGlsU3RyQnl0ZU1vZGUubGVuQih0b2tlbikgPiB0cmltVG9MZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgIHRva2VuID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRva2VuLCB0cmltVG9MZW5ndGgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0cmltVG9MZW5ndGggIT09IC0xICYmIHRva2VuLmxlbmd0aCA+IHRyaW1Ub0xlbmd0aClcclxuICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoMCwgdHJpbVRvTGVuZ3RoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSB0b2tlbjtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAgICAgbGV0IHBpY3R1cmU6IFBJQyA9IFBJQy5idWlsZFBpY3R1cmUoZGF0YVR5cGUsIHRva2VuLCB0YXNrLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIG9wdGlvbnNWYWxpZCA9IHRoaXMub3B0aW9uSXNWYWxpZCh0b2tlbik7XHJcbiAgICAgICAgICAgICAgY2hvaWNlTGlua1tpXSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0b2tlbi50cmltKCksIHBpY3R1cmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmdldENvbXBJZHgoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgICAgICAgICAoKHRoaXMuX2Nob2ljZU51bXMuZ2V0X0l0ZW0obGluZSkpKVtpXSA9IG5ldyBOVU1fVFlQRShjaG9pY2VMaW5rW2ldKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSAoMSAtIGkpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvcHRpb25zVmFsaWQpXHJcbiAgICAgICAgICB0aGlzLmVtcHR5Q2hvaWNlKGxpbmUpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBvcHRpb25zVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVtcHR5Q2hvaWNlKGxpbmUpO1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IDogezF9XCIsIGV4LkdldFR5cGUoKSwgZXguTWVzc2FnZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCA9IG9wdGlvbnNWYWxpZDtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBmb3JtIG9mIHRoZSBzdWJmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRvcE1vc3RGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpLmdldFRvcE1vc3RGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVwbGFjZSB0aGUgdXJsIG9uIGJyb3dzZXIgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRVcmwoKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgMCwgdGhpcy5WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgaW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gd2l0aG91dCBjaGFuZ2luZyB0aGUgY29udHJvbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsXCI+dGhlIGRpc3BsYXllZCB2YWx1ZSB3aXRoIHRoZSBtYXNraW5nIGNoYXJhY3RlcnM8L3BhcmFtPlxyXG4gIGFzeW5jIGdldE1nVmFsdWUoZGlzcFZhbDogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNDaGVja0JveCgpKSB7XHJcbiAgICAgIG1nVmFsID0gZGlzcFZhbCA/IFwiMVwiIDogXCIwXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpIHx8IHN1cGVyLmlzUmFkaW8oKSkge1xyXG5cclxuICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGxpbmUgPCAwKVxyXG4gICAgICAgICAgbGluZSA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcFZhbCA9PT0gXCJudW1iZXJcIilcclxuICAgICAgICAgIGRpc3BWYWwgPSBkaXNwVmFsLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3BWYWwpKVxyXG4gICAgICAgICAgZGlzcFZhbCA9IGRpc3BWYWwuam9pbignLCcpLnRvU3RyaW5nKCk7XHJcblxyXG5cclxuICAgICAgICBpZiAoZGlzcFZhbCA9PT0gXCJcIikge1xyXG4gICAgICAgICAgbWdWYWwgPSBkaXNwVmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIG1nVmFsID0gYXdhaXQgdGhpcy5nZXRMaW5rVmFsdWUoZGlzcFZhbCwgbGluZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZ1ZhbCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gVGhlIGRhdGEgY29udHJvbCB3aWxsIG5ldmVyIHJldHVybiBhbiBpbGxlZ2FsIHZhbHVlIGFzIGEgcmVzdWx0IG9mIGEgdXNlciBzZWxlY3Rpb25cclxuICAgICAgICAgIC8vIGJ1dCBhcyBhIHJlc3VsdCBvZiBhbiBpbml0IGV4cHJlc3Npb24sIHVwZGF0ZSBvcGVyYXRpb24gb3IgdmFsdWVzIG9mIGRhdGEgaW5cclxuICAgICAgICAgIC8vIHRoZSByZWNvcmQuIFRoZXJlZm9yZSwgdGhlIHNhbWUgaWxsZWdhbCB2YWx1ZSBzaG91bGQgYmUgdGFrZW4gZnJvbSBpdHMgc291cmNlLFxyXG4gICAgICAgICAgLy8gd2hpY2ggaXMgYSBmaWVsZCBvciBhbiBleHByZXNzaW9uLiAoRWh1ZCAxOS1qdW4tMjAwMSlcclxuICAgICAgICAgIGxldCByZWZNZ1ZhbDogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbTxzdHJpbmc+KG1nVmFsKTtcclxuICAgICAgICAgIGxldCByZWZJc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtPGJvb2xlYW4+KGlzTnVsbCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG1nVmFsID0gcmVmTWdWYWwudmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBibG9iQ29udGVudFR5cGU6IHN0cmluZyA9ICh0aGlzLl9maWVsZCAhPT0gbnVsbCkgPyB0aGlzLl9maWVsZC5nZXRDb250ZW50VHlwZSgpIDogQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV047XHJcbiAgICAgICAgbWdWYWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRpc3AybWcoZGlzcFZhbCwgdGhpcy5fcGljLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBibG9iQ29udGVudFR5cGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyBmb3IgaW5kaWNlIHBhc3NlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlbGVjdGVkSW5kaWNlXCI+Y29tbWEgc2VwYXJhdGVkIHZhbHVlczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0TGlua1ZhbHVlKHNlbGVjdGVkSW5kaWNlOiBzdHJpbmcsIGxpbmU6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gMDtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICBsZXQgdGVtcDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuXHJcbiAgICBsZXQgY2hvaWNlTGluazogc3RyaW5nW10gPSB0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKTtcclxuXHJcbiAgICBpZiAoY2hvaWNlTGluayAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBjb21wdXRlIHNpemUgb2YgZGlzcGxheWVkIHZhbHVlcyBhcnJheVxyXG4gICAgICBzaXplID0gY2hvaWNlTGluay5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBsZXQgbGlua0luZGljZTogbnVtYmVyW10gPSB0aGlzLmdldExpbmtJZHhGcm9tTGF5ZXIoTWlzYy5HZXRJbnRBcnJheShzZWxlY3RlZEluZGljZSkpO1xyXG5cclxuICAgIGxldCBhcnJheTI6IG51bWJlcltdID0gbGlua0luZGljZTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheTIubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGlkeDogbnVtYmVyID0gYXJyYXkyW2ldO1xyXG4gICAgICBpZiAoaWR4ID49IHNpemUpIHtcclxuICAgICAgICBsZXQgZGNWYWxzOiBEY1ZhbHVlcyA9IHRoaXMuZ2V0RGNWYWxzKCk7XHJcbiAgICAgICAgdGVtcC5wdXNoKGRjVmFscy5nZXRMaW5rVmFsdWUoaWR4IC0gc2l6ZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCBjaG9pY2VMaW5rLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGVtcC5wdXNoKGNob2ljZUxpbmtbaWR4XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGVtcC5wdXNoKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIGxldCB2ZWN0b3JUeXBlOiBWZWN0b3JUeXBlID0gbmV3IFZlY3RvclR5cGUodGhpcy5nZXRGaWVsZCgpKTtcclxuICAgICAgZm9yIChsZXQgaW5keDogbnVtYmVyID0gMDsgaW5keCA8IHRlbXAubGVuZ3RoOyBpbmR4ID0gaW5keCArIDEpIHtcclxuICAgICAgICB2ZWN0b3JUeXBlLnNldFZlY0NlbGwoaW5keCArIDEsIHRlbXAuZ2V0X0l0ZW0oaW5keCksIHRlbXAuZ2V0X0l0ZW0oaW5keCkgPT09IG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IHZlY3RvclR5cGUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGVtcC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVtcC5qb2luKFwiLFwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSB0ZW1wLmdldF9JdGVtKDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0ZXh0IG9uIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFRleHQoKTogdm9pZCB7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBsZXQgbWxzVHJhbnNsYXRlZFZhbHVlOiBhbnkgPSB0aGlzLlZhbHVlO1xyXG4gICAgaWYgKHN1cGVyLmlzQnV0dG9uKCkpIHtcclxuICAgICAgbWxzVHJhbnNsYXRlZFZhbHVlID0gRXZlbnRzLlRyYW5zbGF0ZSh0aGlzLlZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzVGV4dENvbnRyb2woKSB8fCB0aGlzLmlzQnV0dG9uKCkpXHJcbiAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCBkaXNwbGF5TGluZSwgbWxzVHJhbnNsYXRlZFZhbHVlKTtcclxuICAgIGVsc2VcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBkaXNwbGF5TGluZSwgLypcImlubmVySFRNTFwiKi8gSHRtbFByb3BlcnRpZXMuVGV4dCwgbWxzVHJhbnNsYXRlZFZhbHVlKTtcclxuXHJcbiAgICAvLyBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5QUk9QX1NFVF9URVhULCB0aGlzLCBkaXNwbGF5TGluZSwgbWxzVHJhbnNsYXRlZFZhbHVlLCAwKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSByYWRpbyBidXR0b24gY2hlY2tlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYWRpb0xpbmVcIj5pcyB0aGUgbGluZSBvZiB0aGUgcmFkaW8gdGhhdCBuZWVkIHRvIGJlIFNldDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRSYWRpb0NoZWNrZWQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgaW5kZXgpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuXHJcbiAgICAvLyBzZXQgY29udHJvbCB0byBmb2N1c1xyXG4gICAgaWYgKGluZGV4ICE9PSBHdWlDb25zdGFudHMuREVGQVVMVF9WQUxVRV9JTlQpIHtcclxuICAgICAgdGhpcy5zZXRDb250cm9sVG9Gb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29udHJvbFRvRm9jdXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5nZXRGaWVsZCgpICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZ2V0RmllbGQoKS5Db250cm9sVG9Gb2N1cyA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IENoZWNrQm94IFZhbHVlIHRvIHRoZSBjaGVjayBib3ggY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzZXRDaGVja0JveFZhbHVlKGxpbmU6IG51bWJlciwgbWdWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGNoZWNrU3RhdGU6IGJvb2xlYW4gPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihtZ1ZhbCk7XHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgbGluZSwgY2hlY2tTdGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVDaGFuZ2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmU6IG51bWJlciwgdmFsdWVDaGFuZ2VkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICBsZXQgY3VyckRjSWQ6IG51bWJlciA9IHRoaXMuZ2V0RGNSZWYoKTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSByYW5nZSB3YXMgY2hhbmdlZCB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoZSBjb3JyZWN0IGNob2ljZSBvcHRpb25cclxuICAgICAgaWYgKHRoaXMuX3JhbmdlQ2hhbmdlZCkge1xyXG4gICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcmFuZ2VDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0YUN0cmwoKSAmJiBjdXJyRGNJZCAhPT0gdGhpcy5fZGNWYWxJZCkge1xyXG5cclxuICAgICAgICAvLyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogc2VydmVyIHdyaXRlcyBvcHRpb25MaXN0IHRvIHRoZSBIVE1MLiBObyBuZWVkIHRvIGFwcGx5XHJcbiAgICAgICAgLy8gdGhlbVxyXG4gICAgICAgIC8vIGZvciB0aGUgZmlyc3QgdGltZS5cclxuICAgICAgICAvLyBmb3JjZSB1cGRhdGUgb2YgdGhlIHZhbHVlIHdoZW5ldmVyIHRoZSBzZXQgb2Ygb3B0aW9ucyBpcyByZXBsYWNlZFxyXG4gICAgICAgIC8vIGlmIChmb3JtLmZvcm1SZWZyZXNoZWQoKSB8fCBmb3JjZVJlZnJlc2gpXHJcblxyXG4gICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RGNSZWYodGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBkY3JlZiBmb3IgdGhlIGN1cnJlbnQgdGFibGUgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkY0lkXCI+dGhlIG5ldyByZWZlcmVuY2UgdG8gdGhlIGRjdmFsczwvcGFyYW0+XHJcbiAgc2V0RGNSZWYoZGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1RhYmxlUmVmcy5zZXRfSXRlbSh0aGlzLmdldERjTGluZU51bSgpLCBkY0lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXBsYWNlIHRoZSBpbWFnZSBsaXN0IG9mIGFuIGJ1dHRvbiBjb250cm9sIHdpdGggdGhlIGltYWdlIGF0IHRoZSBnaXZlbiBVUkxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEltYWdlTGlzdCh1cmw6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGUgYm9vbGVhbiBwcm9wZXJ0eShleDp2aXNpYmxlXFxlbmFibGUpIG9mIGNvbnRyb2wgYW5kIGl0J3MgY2hpbGRyZW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+cHJvcGVydHkgaWQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+Y29tbWFuZCB0eXBlIHRoYXQgYmVsb25nIHRvIHRoZSBwcm9wIGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ1cGRhdGVUaGlzXCI+PC9wYXJhbT5cclxuICBhc3luYyB1cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4sIHVwZGF0ZVRoaXM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmICh2YWwgJiYgdGhpcy5oYXZlVG9DaGVja1BhcmVudFZhbHVlKCkpIHtcclxuICAgIC8vICB2YWwgPSB0aGlzLmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCk7XHJcbiAgICAvLyB9XHJcbiAgICBpZiAodXBkYXRlVGhpcykge1xyXG5cclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUgPyBIdG1sUHJvcGVydGllcy5WaXNpYmxlIDogSHRtbFByb3BlcnRpZXMuRW5hYmxlZCwgdmFsKTtcclxuXHJcbiAgICB9XHJcbiAgICAvLyB0b2RvOiBzaG91bGQgZ28gb3ZlciBvbmx5IGxpbmtlZCBjb250cm9scyAtIG5vdCBjaGlsZHJlbiBjb250cm9scywgbmVlZCB0byBjaGVjayB3aXRoIFBNIHRoaXMgYmVoYXZpb3JcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgdmFsKTtcclxuICB9XHJcblxyXG4gIFNldEVuYWJsZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5FbmFibGVkLCB2YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZXMgdmlzaWJpbGl0eSBvZiBjb250cm9scyBsaW5rZWQgdG8gdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgdXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKCFzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIC8vIGluIHRhYmxlIGFsbCBjaGlsZHJlbiBhcmUgY29udGFpbmVkLFxyXG4gICAgICAvLyB0YWJsZSdzIHZpc2liaWxpdHlcXGVuYWJsZSB3aWxsIGFmZmVjdCB0aGVtXHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fbGlua2VkQ29udHJvbHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuXHJcbiAgICAgICAgbGV0IGNoaWxkOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fbGlua2VkQ29udHJvbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgLy8gRGVmZWN0IDExNzI5NC4gRG8gbm90IGNvbnRpbnVlIGZvciB0aGUgZmlyc3QgdGltZS4gSXQgYWZmZWN0cyBvbiB0aGUgcGxhY2VtZW50LlxyXG4gICAgICAgIGlmIChjaGlsZC5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGRWYWx1ZTogYm9vbGVhbiA9IChjaGlsZC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIHRydWUpKTtcclxuXHJcbiAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkVmFsdWUgJiYgdmFsO1xyXG5cclxuICAgICAgICBsZXQgY2hpbGRPbkN1cnJlbnRMYXllcjogYm9vbGVhbiA9IHRoaXMuaXNDaGlsZE9uQ3VycmVudExheWVyKGNoaWxkKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbW1hbmRUeXBlID09PSBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFKSB7XHJcblxyXG4gICAgICAgICAgaWYgKGNoaWxkVmFsdWUpIHtcclxuICAgICAgICAgICAgY2hpbGRWYWx1ZSA9IGNoaWxkT25DdXJyZW50TGF5ZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBjaGlsZC51cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCBjaGlsZFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN1cGVyLmlzU3ViZm9ybSgpKSB7XHJcbiAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3ViZm9ybUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRyb2wgaXMgZGVzY2VuZGFudCBvZiBzcGVjaWZpZWQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0Rlc2NlbmRlbnRPZkNvbnRyb2woY29udHJvbDogR3VpTWdDb250cm9sKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNDb250YWluZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoY29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcGFyZW50OiBhbnkgPSB0aGlzLmdldFBhcmVudCgpO1xyXG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTWdDb250cm9sQmFzZSkge1xyXG4gICAgICAgIGlmIChwYXJlbnQgPT09IGNvbnRyb2wpIHtcclxuICAgICAgICAgIGlzQ29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBJZiBjdXJyZW50IGNvbnRyb2wgYmVsb25ncyB0byB0YWJsZSwgdGhlbiBpdCBpcyBhbHNvIGEgZGVzY2VuZGFudCBvZiB0aGUgY29sdW1uIGNvbnRyb2wgdG9cclxuICAgICAgICAgIC8vIHdoaWNoIGl0IGJlbG9uZ3MuIEFjY29yZGluZyB0byBvdXIgaGllcmFyY2h5LCB0aGUgY29udHJvbCBpcyBkaXJlY3QgZGVzY2VuZGFudCBvZiB0YWJsZVxyXG4gICAgICAgICAgLy8gY29udHJvbDsgaGVuY2UsIHdlIG5lZWQgdG8gaGFuZGxlIGNvbHVtbiBjb250cm9sXHJcblxyXG4gICAgICAgICAgbGV0IHBhcmVudENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSAoKHBhcmVudCBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpID8gPE1nQ29udHJvbEJhc2U+cGFyZW50IDogbnVsbCk7XHJcbiAgICAgICAgICBpZiAoY29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4gJiYgcGFyZW50Q29udHJvbCAhPT0gbnVsbCAmJiBwYXJlbnRDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFICYmIGNvbnRyb2wuTGF5ZXIgPT09IHRoaXMuTGF5ZXIpXHJcbiAgICAgICAgICAgIGlzQ29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaXNDb250YWluZWQgPSAoKDxNZ0NvbnRyb2xCYXNlPnBhcmVudCkuaXNEZXNjZW5kZW50T2ZDb250cm9sKGNvbnRyb2wpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc0NvbnRhaW5lZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGVzIHZpc2liaWxpdHkgb3IgZW5hYmxlIHByb3BlcnR5IG9mIHN1YmZvcm0gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+SWQgb2YgdmlzaWJpbGl0eSBvciBlbmFibGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj50eXBlIG9mIHRoZSBHVUkgY29tbWFuZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj52YWx1ZSBmb3IgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICB1cGRhdGVTdWJmb3JtQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGNoaWxkJ3MgbGF5ZXIgaXMgZXF1YWwgdG8gY3VycmVudCBsYXllciBvZiB0aGUgcGFyZW50LCByZWxhdmFudCBmb3IgdGFiIGNvbnRyb2wgZm9yIGFsbCBvdGhlclxyXG4gIC8vLyAgIGNvbnRyb2xzIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGlsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHBhcmVudCBpcyBub3QgdGFiIGNvbnRyb2wgb3IgcGFyZW50IGlzIHRhYiBjb250cm9sIHdpdGggc2FtZSBsYXllcjwvcmV0dXJucz5cclxuICBpc0NoaWxkT25DdXJyZW50TGF5ZXIoY2hpbGQ6IE1nQ29udHJvbEJhc2UpOiBib29sZWFuIHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgY29udHJvbCBoYXMgc2FtZSBsYXllciB0aGF0IGlzIGN1cnJlbnRseSBzZXQgb24gaXQncyBwYXJlbnQgdGFiIGNvbnRyb2xcclxuICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICBsZXQgcGFyZW50TGF5ZXI6IG51bWJlciA9IDA7XHJcbiAgICAgIGlmICh0aGlzLlZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50TGF5ZXIgPSB0aGlzLmdldEN1cnJlbnRMaW5rSWR4KCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBsYXllcjogbnVtYmVyID0gY2hpbGQuZ2V0TGF5ZXIoKTtcclxuICAgICAgaWYgKHBhcmVudExheWVyICE9PSBsYXllciAmJiBsYXllciA+IDApIHtcclxuICAgICAgICAvLyBzb25zIG9mIGxheWVyIDAgZGlzcGxheWVkIGFsd2F5c1xyXG4gICAgICAgIHJldCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBjdXJyZW50IGxpbmsgSWR4IG9mIGNob2ljZSBjb250cm9scywgb3IgemVybyBmb3Igb3RoZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN1cnJlbnRMaW5rSWR4KCk6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyckxpbmtJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpIHx8IHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkpIHtcclxuICAgICAgbGV0IGN1cnJlbnRMYXllcnM6IG51bWJlcltdID0gdGhpcy5nZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpO1xyXG4gICAgICBsZXQgY3VyckxpbmtJbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRMaW5rSWR4RnJvbUxheWVyKGN1cnJlbnRMYXllcnMpO1xyXG4gICAgICBjdXJyTGlua0lkeCA9IGN1cnJMaW5rSW5kaWNlWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJMaW5rSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXRzIGxheWVyIGZyb20gdGhlIHNlbGVjdGVkIGluZGljZSBwYXNzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5rSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YXJyYXkgb2YgbGF5ZXIgdmFsdWVzLjwvcmV0dXJucz5cclxuICBnZXRMYXllckZyb21MaW5rSWR4KGluZGljZTogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgbGF5ZXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGluZGljZS5sZW5ndGgpO1xyXG5cclxuICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCBpbmRpY2UubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgbGV0IGlkeDogbnVtYmVyID0gaW5kaWNlW2lDdHJdO1xyXG4gICAgICAvLyBCeSBkZWZhdWx0LCBsYXllciA9IGxpbmtJZHggdW5sZXNzIGl0IGlzIGEgVGFiIGNvbnRyb2xcclxuXHJcbiAgICAgIGxheWVyc1tpQ3RyXSA9IGlkeDtcclxuXHJcbiAgICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSAmJiBpZHggPj0gMCkge1xyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgICAgIGxpbmUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbGF5ZXJMaXN0OiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxheWVyTGlzdC5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgICBpZiAobGF5ZXJMaXN0ICE9PSBudWxsICYmIGxheWVyTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsYXllcnNbaUN0cl0gPSBsYXllckxpc3QuaW5kZXhPZigoaWR4ICsgMSkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGF5ZXJzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSBzZWxlY3RlZCBpbmRpY2UgZm9yIHNlbGVjdGVkIHZhbHVlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxheWVyc1wiPmFuIGFycmF5IG9mIGN1cnJlbnQgbGF5ZXJzIHRhYiBjb250cm9scy4gSXQgY2FuIGJlIGFycmF5IGJlY2F1c2Ugb2YgbXVsdGlwbGUgc2VsZWN0aW9uLjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmFycmF5IG9mIGluZGljZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldExpbmtJZHhGcm9tTGF5ZXIobGF5ZXJzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuICAgIGxldCBsaW5rSW5kaWNlOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGxheWVycy5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGxheWVycy5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICBsZXQgbGF5ZXI6IG51bWJlciA9IGxheWVyc1tpQ3RyXTtcclxuICAgICAgbGlua0luZGljZVtpQ3RyXSA9IGxheWVyO1xyXG4gICAgICBpZiAoc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICBpZiAobGF5ZXIgPCAwKSB7XHJcbiAgICAgICAgICBsaW5rSW5kaWNlW2lDdHJdID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICAgICAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbGF5ZXJMaXN0OiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxheWVyTGlzdC5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgICAgIGlmIChsYXllckxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxheWVyTGlzdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBsYXllckxpc3QubGVuZ3RoICE9PSAwICYmIGxheWVyIDwgbGF5ZXJMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsaW5rSW5kaWNlW2lDdHJdID0gTk51bWJlci5QYXJzZShsYXllckxpc3RbbGF5ZXJdKSAtIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGlua0luZGljZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWN1cnNpdmUgbWV0aG9kLCBjaGVja3MgaWYgcGFyZW50IG9mIHRoZSBjaGlsZCBpcyB2aXNpYmxlXFxlbmFibGUsIHVsdGlsIHRoZXJlIGlzIG5vIHBhcmVudCBvciBmb3VuZFxyXG4gIC8vLyAgIHBhcmVudCB0aGF0IGlzIGhpZGRlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNQYXJlbnRQcm9wVmFsdWUocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjb2x1bW46IE1nQ29udHJvbEJhc2UgPSB0aGlzLkZvcm0uZ2V0Q29udHJvbENvbHVtbih0aGlzKTtcclxuICAgIGxldCBwYXJlbnQ6IE1nQ29udHJvbEJhc2UgPSA8TWdDb250cm9sQmFzZT50aGlzLmdldExpbmtlZFBhcmVudCh0cnVlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgLy8gbm8gbW9yZSBwYXJlbnRzXHJcbiAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gcGFyZW50IGlzIGhpZGRlblxyXG4gICAgICBpZiAoIXBhcmVudC5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIHRydWUpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnQuaXNDaGlsZE9uQ3VycmVudExheWVyKHRoaXMpKSB7XHJcbiAgICAgICAgICAvLyBwYXJlbnQgaXMgdGFiIGNvbnRyb2wgd2l0aCBjdXJyZW50IGxheWVyXHJcbiAgICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSBjaGlsZCdzIGxheWVyXHJcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBmb3IgdGFibGUgY2hpbGRyZW4gY2hlY2sgaWYgY29sdW1uIHZpc2libGVcclxuICAgICAgICAgIHJlc3VsdCA9ICghKGNvbHVtbiAhPT0gbnVsbCAmJiAhY29sdW1uLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpICYmIHBhcmVudC5pc1BhcmVudFByb3BWYWx1ZShwcm9wSWQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGNvbnRyb2wgdG8gd2hpY2ggdGhpcyBjb250cm9sIGlzIGxpbmtlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja1N1YmZvcm1GYXRoZXJcIj5pZiB0cnVlIGNoZWNrIGZvciBTdWJmb3JtIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGlua2VkUGFyZW50KGNoZWNrU3ViZm9ybUZhdGhlcjogYm9vbGVhbik6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIge1xyXG5cclxuICAgIGlmICh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggIT09IC0xKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChjaGVja1N1YmZvcm1GYXRoZXIgJiYgdGhpcy5Gb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgY3VycmVudCBsaW5lIHZhbHVlIG9mIHRoZSByZWFkT25seSBoaXN0b3J5IGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0PC9wYXJhbT5cclxuICBTZXRDdXJyUmVhZE9ubHkobmV3VmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUmVhZE9ubHkuc2V0X0l0ZW0odGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKSwgbmV3VmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN1cnJlbnQgcmVhZE9ubHkgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sJ3MgY3VycmVudCBsaW5lIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVhZE9ubHkgdmFsdWU8L3JldHVybnM+XHJcbiAgR2V0Q3VyclJlYWRPbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHN1cGVyLmlzVGFibGVDb250cm9sKCkgPyAwIDogdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBjdXJyT2JqOiBhbnkgPSB0aGlzLl9jdXJyUmVhZE9ubHkuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICBsZXQgY3VycjogYm9vbGVhbjtcclxuICAgIGlmIChjdXJyT2JqID09PSBudWxsKSB7XHJcbiAgICAgIGN1cnIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fY3VyclJlYWRPbmx5LnNldF9JdGVtKGxpbmUsIGN1cnIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN1cnIgPSA8Ym9vbGVhbj5jdXJyT2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgY29udHJvbCBpcyBhIERhdGEgQ29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNEYXRhQ3RybCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGRjcmVmIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsaW5lIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZGNJZDwvcmV0dXJucz5cclxuICBnZXREY1JlZigpOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGNMaW5lTnVtKCk7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLl9kY1RhYmxlUmVmcy5nZXRfSXRlbSh0aGlzLmdldERjTGluZU51bSgpKTtcclxuICAgIGxldCBkY0lkOiBudW1iZXI7XHJcbiAgICBpZiAob2JqID09PSBudWxsKSB7XHJcbiAgICAgIGRjSWQgPSAtMjtcclxuICAgICAgdGhpcy5fZGNUYWJsZVJlZnMuc2V0X0l0ZW0obGluZSwgZGNJZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGNJZCA9IDxudW1iZXI+b2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRjSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBmb3IgYSBkYXRhIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0RGNMaW5lTnVtKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1JlcGVhdGFibGUgPyB0aGlzLkZvcm0uRGlzcGxheUxpbmUgOiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZSBvbmUgY2hvaWNlIG9wdGlvbiBmcm9tIGl0ZW1zIGxpc3QgaXMgdmFsaWQuIFRoZSBjaGVjayBpcyBvbmx5IGZvciBpdGVtcyBsaXN0IGFuZCBub3QgZm9yIHRoZVxyXG4gIC8vLyAgIGRhdGEgc291cmNlIG9wdGlvbnMsIChGWUk6IGZvciB0aGUgb3B0aW9uIGZyb20gdGhlIERhdGFDdHJsLCB3ZSBhcmUgbm90IGNhbGxpbmcgdGhpc1xyXG4gIC8vLyAgIG1ldGhvZCwgTk8gQ0hFQ0sgSVMgRE9ORSkgaW4gb25saW5lIDpjaV9jaGVja19yYW5nZV9zdHJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3B0aW9uOlwiPm9uZSBvcHRpb24gZnJvbSB0aGUgaXRlbXMgbGlzdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIG9wdGlvbklzVmFsaWQob3B0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmIG9wdGlvbi5sZW5ndGggPiAwICYmIG9wdGlvbi5pbmRleE9mKCcwJykgPT09IC0xKSB7XHJcbiAgICAgIGxldCBjb252ZXJ0TnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBjb252ZXJ0TnVtLm51bV80X2Ffc3RkKG9wdGlvbik7XHJcbiAgICAgIGlmIChjb252ZXJ0TnVtLm51bV9pc196ZXJvKCkpIHtcclxuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByZXBhcmVzIGFuZCByZXR1cm5zIHRoZSBvcmRlcmVkIGxpc3QgYmFzZWQgb24gbGF5ZXJzIGluIGxheWVyTGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaG9pY2VEaXNwTGlzdFwiPnVub3JkZXJlZCBsaXN0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JkZXJlZERpc3BMaXN0KGNob2ljZURpc3BMaXN0OiBzdHJpbmdbXSwgbGluZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG5cclxuICAgIGxldCBjaG9pY2VMYXllclN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBkaXNwQXJyeUxpc3Q6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCBsYXllckFycnlMaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgbGF5ZXJQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFX0xBWUVSU19MSVNUKTtcclxuXHJcbiAgICBpZiAobGF5ZXJQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIGNob2ljZUxheWVyU3RyID0gYXdhaXQgbGF5ZXJQcm9wLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNob2ljZUxheWVyU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlTGF5ZXJTdHIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjaG9pY2VMYXllclN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hvaWNlTGF5ZXJTdHIubGVuZ3RoID4gMCAmJiBjaG9pY2VEaXNwTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gY2hvaWNlTGF5ZXJTdHIuc3BsaXQoXCIsXCIpO1xyXG4gICAgICBsZXQgcG9zQ29weUluZGV4OiBudW1iZXIgPSAtMTtcclxuICAgICAgZm9yIChsZXQgaW5kZXg6IG51bWJlciA9IDA7IGluZGV4IDwgbGF5ZXJMaXN0Lmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDEpIHtcclxuICAgICAgICBsZXQgY3VyckxheWVyTGlzdFZhbDogc3RyaW5nID0gbGF5ZXJMaXN0W2luZGV4XS50cmltKCk7XHJcbiAgICAgICAgaWYgKCEobGF5ZXJBcnJ5TGlzdC5pbmRleE9mKGN1cnJMYXllckxpc3RWYWwpICE9PSAtMSkpIHtcclxuICAgICAgICAgIGxldCByZWZQb3NDb3B5SW5kZXg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihwb3NDb3B5SW5kZXgpO1xyXG4gICAgICAgICAgbGV0IGlzTnVtYmVyOiBib29sZWFuID0gTk51bWJlci5UcnlQYXJzZShjdXJyTGF5ZXJMaXN0VmFsLCByZWZQb3NDb3B5SW5kZXgpO1xyXG4gICAgICAgICAgcG9zQ29weUluZGV4ID0gcmVmUG9zQ29weUluZGV4LnZhbHVlO1xyXG5cclxuICAgICAgICAgIC8vIHBvc0NvcHlJbmRleCBpcyAxQmFzZWQsIHNvIG11c3Qgbm90IGJlIHplcm8uIEFsc28sIGl0IG11c3Qgbm90IGJlXHJcbiAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gbm8gb2YgZWxlbWVudHMgaW4gdGhlIERpcGxheUxpc3QuXHJcblxyXG4gICAgICAgICAgaWYgKGlzTnVtYmVyICYmIHBvc0NvcHlJbmRleCA+IDAgJiYgcG9zQ29weUluZGV4IDw9IGNob2ljZURpc3BMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBkaXNwQXJyeUxpc3QucHVzaCgoY2hvaWNlRGlzcExpc3RbcG9zQ29weUluZGV4IC0gMV0pLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIGxheWVyQXJyeUxpc3QucHVzaChjdXJyTGF5ZXJMaXN0VmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmdbXTtcclxuICAgIGlmIChkaXNwQXJyeUxpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IGNob2ljZURpc3BMaXN0O1xyXG4gICAgICB0aGlzLl9jaG9pY2VMYXllckxpc3Quc2V0X0l0ZW0obGluZSwgbmV3IEFycmF5PHN0cmluZz4oMCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KGRpc3BBcnJ5TGlzdC5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IHJlc3VsdC5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICAgIHJlc3VsdFtfYWldID0gbnVsbDtcclxuXHJcbiAgICAgIHJlc3VsdCA9IGRpc3BBcnJ5TGlzdC5Ub0FycmF5KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBsYXllckFycnlMaXN0LlRvQXJyYXkoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBwcmV2aW91cyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsKCk6IHZvaWQge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5zZXRQcmV2SXNOdWxsX1RvTnVsbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vICAgc2V0cyB0aGUgcHJldklzTnVsbCB2YWx1ZSBvZiB0aGUgcHJldklzTnVsbCBhcnJheVxyXG4gIC8vLyAgIHRoZSBuZXdWYWx1ZSBjYW4gYmUgTlVMTCBvciBib29sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRQcmV2SXNOdWxsX1RvTnVsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZJc051bGxzLnNldF9JdGVtKHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSksIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgYW4gZXhwcmVzc2lvbiB3YXMgc2V0IGFzIHRoZSBkYXRhPC9yZXR1cm5zPlxyXG4gIGV4cHJlc3Npb25TZXRBc0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsRXhwSWQgPiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGxlZCB3aGVuZXZlciB0aGUgY2hvaWNlIGxpc3Qgb2YgYSBTRUxFQ1QgY29udHJvbCBoYXMgY2hhbmdlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJSYW5nZShsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYXZlIHRvIGNoZWNrIHBhcmVudCB2aXNpYmlsaXR5XFxlbmFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlLCBpZiB0aGUgY29udHJvbCBpcyBjb25uZWN0ZWQgdG8gYSBjb250YWluZXIgb3IgdGhlIHRhc2sgaXMgYSBzdWJmb208L3JldHVybnM+XHJcbiAgaGF2ZVRvQ2hlY2tQYXJlbnRWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIGxldCByZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggIT09IC0xKSB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb250YWluZWRJbkxpbmtlZFBhcmVudCgpKSB7XHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjb250YWluZWQgdGFiIGNoaWxkcmVuIG9mIGFsbCBsYXllcnMgYXJlIG9uIHRoZSBzYW1lIHdpbmRvdyxcclxuICAgICAgLy8gc28gd2UgbXVzdCBoYW5kbGUgdGhlcmUgdmlzaWJpbGl0eVxcZW5hYmxlXHJcblxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fbGlua2VkUGFyZW50RGl0SWR4KS5pc1RhYkNvbnRyb2woKSB8fCB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpLmlzR3JvdXAoKSkge1xyXG4gICAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5Gb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgcmV0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgY29udHJvbCBpcyBjb250YWluIGluIGl0cyBsaW5rZWQgcGFyZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ29udGFpbmVkSW5MaW5rZWRQYXJlbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSAmJiB0aGlzLl9jb250YWluZXJEaXRJZHggPT09IHRoaXMuX2xpbmtlZFBhcmVudERpdElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb21iaW5lIHR3byBzdHJpbmdzIGFycmF5IGludG8gb25lLiBFYWNoIG9mIHRoZSBvcmlnaW5hbCBhcnJheXMgbWF5IGJlIG51bGwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZpcnN0U3RyaW5nc1wiPnRoZSBmaXJzdCBzdHJpbmdzIGFycmF5IHRoYXQgd2lsbCBhbHdheXMgb2NjdXB5IHRoZSBmaXJzdCBhcnJheSBjZWxsczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsYXN0U3RyaW5nc1wiPnRoZSBsYXN0IHN0cmluZ3MgYXJyYXkgdGhhdCB3aWxsIGFsd2F5cyBvY2N1cHkgdGhlIGxhc3QgYXJyYXkgY2VsbHM8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gY29tYmluZWQgU3RyaW5ncyBhcnJheTwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBjb21iaW5lU3RyaW5nQXJyYXlzKGZpcnN0U3RyaW5nczogc3RyaW5nW10sIGxhc3RTdHJpbmdzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuXHJcbiAgICBpZiAoZmlyc3RTdHJpbmdzICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGZpcnN0U3RyaW5ncyk7XHJcblxyXG4gICAgaWYgKGxhc3RTdHJpbmdzICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGxhc3RTdHJpbmdzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuLCBsaW5lPzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiAocHJvcElkID09PSBudWxsIHx8IHByb3BJZC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAoZGVmYXVsdFJldFZhbCA9PT0gbnVsbCB8fCBkZWZhdWx0UmV0VmFsLmNvbnN0cnVjdG9yID09PSBCb29sZWFuKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8wKHByb3BJZCwgZGVmYXVsdFJldFZhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8xKHByb3BJZCwgZGVmYXVsdFJldFZhbCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgYm9vbGVhbiBjb21wdXRlZCB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICBwcml2YXRlIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBwcm9wLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCAtIGlmIHRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgYW5kIHRoZSBsaW5lIGlzXHJcbiAgLy8vIGRpZmZlcmVudCB0aGFuIHRoZSBmb3JtcyBjdXJyZW50IGxpbmUgdGhlbiByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjb250cm9sIHByb3BlcnR5IGF0IHRoYXQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgbnVtYmVyIGluIHRhYmxlIGluIHdoaWNoIHRoZSBjb250cm9sIGlzIGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMShwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbiwgbGluZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Byb3BlcnR5UmVwZWF0YWJsZShwcm9wSWQpICYmIHRoaXMuRm9ybS5EaXNwbGF5TGluZSAhPT0gbGluZSkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkocHJvcElkKTtcclxuICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBwcm9wLmdldFByZXZWYWx1ZShsaW5lKTtcclxuICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCBkZWZhdWx0UmV0VmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2wgLSBpZiB0aGUgY29udHJvbCBpcyByZXBlYXRhYmxlIGFuZCB0aGUgbGluZSBpc1xyXG4gIC8vLyAgIGRpZmZlcmVudCB0aGFuIHRoZSBmb3JtcyBjdXJyZW50IGxpbmUgdGhlbiByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjb250cm9sIHByb3BlcnR5IGF0IHRoYXRcclxuICAvLy8gICBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBudW1iZXIgaW4gdGFibGUgaW4gd2hpY2ggdGhlIGNvbnRyb2wgaXMgbG9jYXRlZDwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wV2l0aExpbmUocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4sIGxpbmU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNQcm9wZXJ0eVJlcGVhdGFibGUocHJvcElkKSAmJiB0aGlzLkZvcm0uRGlzcGxheUxpbmUgIT09IGxpbmUpIHtcclxuICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKHByb3BJZCk7XHJcbiAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gcHJvcC5nZXRQcmV2VmFsdWUobGluZSk7XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChwcm9wSWQsIGRlZmF1bHRSZXRWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlZmF1bHRSZXRWYWxcIj50aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0KTwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChwcm9wSWQpO1xyXG4gICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHByb3BJZCBwcm9wZXJ0eSBpcyByZXBlYXRhYmxlIGZvciB0aGlzIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUHJvcGVydHlSZXBlYXRhYmxlKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSZXBlYXRhYmxlOiBib29sZWFuID0gdGhpcy5Jc1JlcGVhdGFibGU7XHJcbiAgICBpZiAoaXNSZXBlYXRhYmxlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBzdXBlci5pc1RhYmxlQ29udHJvbCgpICYmIFByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhbmQgdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGluIG1hZ2ljIGludGVybmFsIGZvcm1hdCB0byBiZSBkaXNwbGF5ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbDogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkY1JhbmdlSXNFbXB0eTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgaWYgKG1nVmFsID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuVmFsdWUgPSBcIlwiO1xyXG4gICAgICAvLyBRQ1IgMzA4NDc1IC0gY29udHJvbHMgdGhhdCBhcmUgSW5pdGlhbGl6ZWQgd2l0aCBudWxsIHNob3VsZCBiZSBnaXZlbiBtYWdpYyBkZWZhdWx0IHZhbHVlLlxyXG4gICAgICBpZiAoIWlzTnVsbClcclxuICAgICAgICBtZ1ZhbCA9IEZpZWxkRGVmLmdldE1hZ2ljRGVmYXVsdFZhbHVlKHRoaXMuRGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsYXllcnM6IG51bWJlcltdID0gdGhpcy5nZXRMYXllckZyb21MaW5rSWR4KGF3YWl0IHRoaXMuZ2V0SW5kZXhPZkNob2ljZShtZ1ZhbCwgbGluZSwgaXNOdWxsKSk7XHJcblxyXG4gICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBubyBzZWxlY3Rpb24gZm9yIGEgdGFiIGNvbnRyb2wuXHJcbiAgICAgICAgLy8gU28sIGlmIHRoZXJlIGlzIG5vIFRhYiB0byBiZSBzZWxlY3RlZCwgc2VsZWN0IHRoZSBmaXJzdCBUYWIgYW5kXHJcbiAgICAgICAgLy8gYWxzbyB1cGRhdGUgdGhlIGZpZWxkJ3MgdmFsdWUgYWNjb3JkaW5nbHkuXHJcblxyXG4gICAgICAgIGlmIChsYXllcnNbMF0gPCAwICYmIHN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBsYXllcnNbMF0gPSAwO1xyXG4gICAgICAgICAgbWdWYWwgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShsYXllcnNbMF0udG9TdHJpbmcoKSwgbGluZSk7XHJcbiAgICAgICAgICBpc051bGwgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiBtZ1ZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoPEd1aVRhc2tCYXNlPnRoaXMuX2ZpZWxkLmdldFRhc2soKSkuVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2ZpZWxkLCBtZ1ZhbCwgaXNOdWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IE1pc2MuR2V0Q29tbWFTZXBlcmF0ZWRTdHJpbmcobGF5ZXJzKTtcclxuICAgICAgICBkY1JhbmdlSXNFbXB0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICM0NTAyNDg6IGFuIGVtcHR5IHJhbmdlIGluIHRoZSBkYXRhIGNvbnRyb2wgY2F1c2VkIGRlbGV0aW5nIHRoZSB2YWx1ZVxyXG4gICAgLy8gb2YgdGhlIGNvbnRyb2wgd2hlbiBsZWF2aW5nIGl0LiBOb3csIHRoZSByYW5nZSBvZiB0aGUgY29udHJvbCBpcyB1c2VkIHdoZW5cclxuICAgIC8vIHRoZSBkYXRhIGNvbnRyb2wgcmFuZ2UgaXMgZW1wdHkuXHJcbiAgICBpZiAoZGNSYW5nZUlzRW1wdHkpIHtcclxuICAgICAgaWYgKCFzdXBlci5pc0NoZWNrQm94KCkgJiYgKHRoaXMuX2ZpZWxkID09PSBudWxsIHx8ICFpc051bGwgfHwgIXRoaXMuX2ZpZWxkLmhhc051bGxEaXNwbGF5VmFsdWUoKSkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuX2ZpZWxkID09PSBudWxsICYmIGlzTnVsbCkgJiYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FIHx8IHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTikpIHtcclxuICAgICAgICAgICAgICB0aGlzLlZhbHVlID0gbWdWYWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGV0IGluQ29udHJvbDogYm9vbGVhbiA9IHRoaXMuSW5Db250cm9sO1xyXG4gICAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AobWdWYWwsIHRoaXMuX3JhbmdlLCB0aGlzLl9waWMsIHRydWUsIHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBpbkNvbnRyb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEZWZlY3QgIyAxMzg4MDMgOiBGaXggdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgdW5pUGFhUy4gRG8gbm90IGNhbGwgcnRyaW1WYWx1ZSgpIHdoZW4gcmVmcmVzaGluZyB0aGUgZGlzcGxheSBpZiB0aGUgZGF0YSB0eXBlXHJcbiAgICAgICAgICAvLyBpcyBub3QgbnVtZXJpYyBvciBsZWZ0IGp1c3RpZnkgcHJvcGVydHkgaXMgTm8uXHJcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuVmFsdWUgPT09ICdzdHJpbmcnICYmICghdGhpcy5fcGljLmlzQXR0ck51bWVyaWMoKSB8fCB0aGlzLl9waWMuaXNMZWZ0KCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucnRyaW1WYWx1ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGlubmVyRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoaW5uZXJFeGNlcHRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sOiAnezB9JywgbWd2YWw6IHsxfVwiLCB0aGlzLk5hbWUsIG1nVmFsKSwgaW5uZXJFeGNlcHRpb24pKTtcclxuICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIG1nVmFsID0gRmllbGREZWYuZ2V0TWFnaWNEZWZhdWx0VmFsdWUodGhpcy5EYXRhVHlwZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGlubmVyRXhjZXB0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NoZWNrQm94KCkpXHJcbiAgICAgICAgICB0aGlzLlZhbHVlID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4obWdWYWwpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gVHJhbnNsYXRlIGxvZ2ljYWwgbmFtZSBmb3IgaW1hZ2UgY29udHJvbC5cclxuICAgIGlmICgoc3VwZXIuaXNJbWFnZUNvbnRyb2woKSAmJiB0aGlzLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHx8IHN1cGVyLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICBtZ1ZhbCA9IEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZShtZ1ZhbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLklzTnVsbCA9IGlzTnVsbDtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlWYWx1ZShtZ1ZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyBpZiB0aGUgY29udHJvbCdzIHZhbHVlIGlzIG1vZGlmaWVkIGFuZCBpZiBzbywgdXBkYXRlcyB0aGUgTW9kaWZpZWRCeVVzZXIgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1ZhbHVlXCI+PC9wYXJhbT5cclxuICBVcGRhdGVNb2RpZmllZEJ5VXNlcihuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gRm9yIGltYWdlIGNvbnRyb2wgYW5kIGltYWdlIGJ1dHRvbiwgdGhlIHZhbHVlIHdvdWxkIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiBCdXQsIGlmIGl0IGhhc1xyXG4gICAgLy8gYSBsb2dpY2FsIG5hbWUsIGl0IGlzIHJlcGxhY2VkLiBPciBpZiBpdCBpcyBmaWxlU2VydmVyIGdldCwgdGhlIHZhbHVlIGlzIHJlcGxhY2VkIGJ5IGEgc2VydmVyIHVybC5cclxuICAgIC8vIEluIGJvdGggdGhlc2UgY2FzZXMsIHdlIHNob3VsZCBub3QgbWFyayBpdCBhcyBtb2RpZmllZC5cclxuICAgIGlmICghKHN1cGVyLmlzQnV0dG9uKCkgfHwgc3VwZXIuaXNJbWFnZUNvbnRyb2woKSkpIHtcclxuICAgICAgbGV0IGN0cmxDdXJySXNOdWxsOiBib29sZWFuID0gdGhpcy5Jc051bGw7XHJcbiAgICAgIGxldCB2YWxDaGFuZ2VkOiBib29sZWFuID0gKHRoaXMuaXNEaWZmZXJlbnRWYWx1ZShuZXdWYWx1ZSwgZmFsc2UsIGZhbHNlKSk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgdmFsdWUgZGlkbid0IGNoYW5nZSB0aGVuIGxldCdzIGNoZWNrIGlmIHRoZSBudWxsaXR5IGhhdmUgY2hhbmdlZFxyXG4gICAgICBpZiAoIXZhbENoYW5nZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5DYW5HZXROdWxsRnJvbUNvbnRyb2xWYWx1ZSgpKSB7XHJcbiAgICAgICAgICB2YWxDaGFuZ2VkID0gKGN0cmxDdXJySXNOdWxsICE9PSB0aGlzLmlzTnVsbFZhbHVlKG5ld1ZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWxDaGFuZ2VkIHx8IHRoaXMuS2V5U3Ryb2tlT24pIHtcclxuICAgICAgICB0aGlzLk1vZGlmaWVkQnlVc2VyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJUcmltcyB0aGUgY29udHJvbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBydHJpbVZhbHVlKCk6IHZvaWQge1xyXG4gICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgIHRoaXMuVmFsdWUgPSBOU3RyaW5nLlRyaW1FbmQodGhpcy5WYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG1pbmltdW1WYWx1ZUxlbmd0aDogbnVtYmVyID0gdGhpcy5nZXRNaW5pbXVtVmFsdWVMZW5ndGgoKTtcclxuICAgICAgLy8gUlRyaW0gdGhlIHZhbHVlIGJleW9uZCB0aGlzIGluZGV4XHJcbiAgICAgIGlmICh0aGlzLlZhbHVlLmxlbmd0aCA+IG1pbmltdW1WYWx1ZUxlbmd0aCkge1xyXG4gICAgICAgIGxldCBzdHI6IHN0cmluZyA9IHRoaXMuVmFsdWUuc3Vic3RyKG1pbmltdW1WYWx1ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIC8vIGNvcHkgdGhlIG1pbmltdW0gbGVuZ3RoIHZhbHVlIGFzIGlzXHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IHRoaXMuVmFsdWUuc3Vic3RyKDAsIG1pbmltdW1WYWx1ZUxlbmd0aCk7XHJcbiAgICAgICAgLy8gcnRyaW0gdGhlIHZhbHVlIGJleW9uZCBtaW5pbXVtIGxlbmd0aFxyXG4gICAgICAgIHRoaXMuVmFsdWUgPSB0aGlzLlZhbHVlICsgU3RyVXRpbC5ydHJpbVdpdGhOdWxsKHN0ciwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFsd2F5cyB0cmltIHRoZSBudW1lcmljIHZhbHVlLlxyXG4gICAgICBpZiAoc3VwZXIuaXNUZXh0Q29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykge1xyXG4gICAgICAgIHRoaXMuVmFsdWUgPSBOU3RyaW5nLlRyaW1FbmQodGhpcy5WYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGxlbmd0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRNaW5pbXVtVmFsdWVMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIGxldCBtaW5MZW5ndGg6IG51bWJlciA9IHRoaXMuX3BpYy5nZXRNYXNrTGVuZ3RoKCk7XHJcblxyXG4gICAgLy8gdHJhdmVyc2UgZnJvbSByaWdodCB0aWxsIGEgdmFsaWQgbWFzayBjaGFyIGlzIGVuY291bnRlcmVkXHJcbiAgICB3aGlsZSAobWluTGVuZ3RoID4gMCAmJiAhdGhpcy5fcGljLnBpY0lzTWFzayhtaW5MZW5ndGggLSAxKSkge1xyXG4gICAgICBtaW5MZW5ndGggPSBtaW5MZW5ndGggLSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1pbkxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNOdWxsVmFsdWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCByZXRJc051bGxDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5DYW5HZXROdWxsRnJvbUNvbnRyb2xWYWx1ZSgpICYmIHN0ciA9PT0gXCJcIikge1xyXG4gICAgICByZXRJc051bGxDb250cm9sID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRJc051bGxDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRoaXMgY29udHJvbCBjYW4gZ2V0IG51bGwgdmFsdWUgZnJvbSB0aGUgY29udHJvbCBoaW1zZWxmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIHNwZWNpZmljIGluZGV4IGNvcnJlc3BvbmRzIHRvIGEgbnVsbCB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQ2hvaWNlTnVsbChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbjtcclxuICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICBsZXQgZGNWYWxzOiBEY1ZhbHVlcyA9IHRoaXMuZ2V0RGNWYWxzKCk7XHJcbiAgICAgIHJldHVybiBkY1ZhbHMuaXNOdWxsKGlkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ29tcHV0ZXMgdGhlIGNvbnRyb2wncyB2YWx1ZSBlaXRoZXIgZnJvbSBleHByZXNzaW9uIG9yIGZpZWxkIGFuZCByZWZyZXNoZXMgdGhlIEdVSSA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9yY2VSZWZyZXNoXCI+PC9wYXJhbT5cclxuICBhc3luYyBDb21wdXRlQW5kUmVmcmVzaERpc3BsYXlWYWx1ZShmb3JjZVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChmb3JjZVJlZnJlc2gpIHtcclxuICAgICAgdGhpcy5yZXNldFByZXZWYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCB3YXNFdmFsdWF0ZWQ6IGJvb2xlYW47XHJcbiAgICAgIGxldCByZWZXYXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtPGJvb2xlYW4+KHdhc0V2YWx1YXRlZCk7XHJcblxyXG4gICAgICBsZXQgcmV0RXhwOiBzdHJpbmcgPVxyXG4gICAgICAgIGF3YWl0IHRoaXMuRXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX3ZhbEV4cElkLCB0aGlzLkRhdGFUeXBlLCB0aGlzLl9waWMuZ2V0U2l6ZSgpLCB0cnVlLCBTdG9yYWdlQXR0cmlidXRlLlNLSVAsIGZhbHNlLCByZWZXYXNFdmFsdWF0ZWQpO1xyXG4gICAgICB3YXNFdmFsdWF0ZWQgPSByZWZXYXNFdmFsdWF0ZWQudmFsdWU7XHJcbiAgICAgIGlmICh3YXNFdmFsdWF0ZWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLlNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUocmV0RXhwLCByZXRFeHAgPT09IG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgPSBOU3RyaW5nLkVtcHR5O1xyXG4gICAgICAgIGxldCBpc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgcmVmVmFsdWU6IFJlZlBhcmFtPHN0cmluZz4gPSBuZXcgUmVmUGFyYW08c3RyaW5nPih2YWx1ZSk7XHJcbiAgICAgICAgbGV0IHJlZklzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4oaXNOdWxsKTtcclxuICAgICAgICAoPEd1aVRhc2tCYXNlPnRoaXMuX2ZpZWxkLmdldFRhc2soKSkuZ2V0RmllbGREaXNwbGF5VmFsdWUodGhpcy5fZmllbGQsIHJlZlZhbHVlLCByZWZJc051bGwpO1xyXG4gICAgICAgIHZhbHVlID0gcmVmVmFsdWUudmFsdWU7XHJcbiAgICAgICAgaXNOdWxsID0gcmVmSXNOdWxsLnZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZSh2YWx1ZSwgaXNOdWxsKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoIXN1cGVyLmlzVGFibGVDb250cm9sKCkgJiYgIXN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5VmFsdWUodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIERlY2lkZXMgaWYgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHJlZnJlc2hlZCB3aGlsZSBlbnRlcmluZyBhIGNvbnRyb2wuIFZhbHVlcyBmb3Igc29tZSBkYXRhIHR5cGVzXHJcbiAgLy8vIGFyZSBkaXNwbGF5ZWQgZGlmZmVyZW50bHkgd2hpbGUgcGFya2VkIG9uIHRoZSBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRSZWZyZXNoT25Db250cm9sRW50ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUICYmIHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCAmJiAodGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8XHJcbiAgICAgIHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSB8fCB0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGRpc3BsYXllZCB2YWx1ZSBvbmx5ICh3aXRob3V0IHRoZSBvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZSBjb250cm9sKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPmlzIHRoZSBtYWdpYyBpbnRlcm5hbCB2YWx1ZSBvZiB0aGUgcHJlc2VudGF0aW9uIHZhbHVlPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IHZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgc2F2ZVZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IHZhbHVlQ2hhbmdlZDtcclxuXHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICAvLyBBVFRFTlRJT046XHJcbiAgICAvLyB0aGUgdXNlIG9mIHRoZSBmdW5jdGlvbiBnZXROYW1lKCkgaW5zdGVhZCBvZiB1c2luZyB0aGUgbmFtZSBtZW1iZXIgdmFyaWFibGVcclxuICAgIC8vIGlzIHRvIGVuaGFuY2UgdGhlIHVzZSBvZiBjb250cm9scyB3aGljaCBhcmUgY29udGFpbmVkIGluIGEgdGFibGVcclxuICAgIC8vIHVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIGxldCBwcmV2VmFsdWU6IHN0cmluZyA9IHRoaXMuX3ByZXZWYWx1ZXMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICAgIGxldCBwcmV2TnVsbDogYm9vbGVhbiA9IHRoaXMuZ2V0UHJldklzTnVsbCgpO1xyXG5cclxuICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZSh0aGlzLkRhdGFUeXBlKSkge1xyXG4gICAgICAgIGlmIChTdHJVdGlsLnJ0cmltKG1nVmFsKSA9PT0gU3RyVXRpbC5ydHJpbShwcmV2VmFsdWUpIHx8XHJcbiAgICAgICAgICAobWdWYWwgIT09IG51bGwgJiYgU3RyVXRpbC5ydHJpbShtZ1ZhbCkgPT09IFN0clV0aWwucnRyaW0ocHJldlZhbHVlKSkpIHtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByZXZOdWxsICE9PSB0aGlzLklzTnVsbCkge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgO1xyXG4gICAgICAgIGlmIChtZ1ZhbCA9PT0gcHJldlZhbHVlIHx8IChtZ1ZhbCAhPT0gbnVsbCAmJiBtZ1ZhbCA9PT0gcHJldlZhbHVlKSlcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocHJldk51bGwgIT09IHRoaXMuSXNOdWxsKVxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbShsaW5lLCBtZ1ZhbCk7XHJcbiAgICAgIHRoaXMuc2V0UHJldklzTnVsbCh0aGlzLklzTnVsbCk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEU6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU46XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MQUJFTDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9HUk9VUDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NUQVRVU19CQVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9GUkFNRV9TRVQ6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT05UQUlORVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9GUkFNRV9GT1JNOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU0JfTEFCRUw6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSU5FOlxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVI6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkICYmIHRoaXMuVmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5zZXRVcmwoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NCX0lNQUdFOlxyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCAmJiB0aGlzLlZhbHVlICE9IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW1hZ2UoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWDpcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQgfHwgIHRoaXMuZm9yY2VSZWZyZXNoKVxyXG4gICAgICAgICAgICB0aGlzLnNldENoZWNrQm94VmFsdWUobGluZSwgbWdWYWwpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVDpcclxuICAgICAgICAgIHNhdmVWYWx1ZUNoYW5nZWQgPSB2YWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtTGlzdEJ5RGF0YVNvdXJjZShsaW5lLCB2YWx1ZUNoYW5nZWQpO1xyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAvLyBmaXhlZCBidWcjOjc3NjIxNSwgODAwNzYzLDk0MTg0MSwgdGhlIHByZXZWYWx1ZSBpcyBzYXZlIGFzIG1ndmFsIG5lZWQgdG8gY29udmVydCB0byBsYXllclxyXG4gICAgICAgICAgICBsZXQgcHJldkRpc3BsYXlWYWx1ZTogbnVtYmVyW10gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gRml4IGJ1ZyM6Nzg0MzkxXHJcbiAgICAgICAgICAgIC8vIElmIEl0ZW1MaXN0IHdhcyB1cGRhdGUgcmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlIHRoZW4gdGhlIHZhbHVlIG11c3QgYmUgc2V0XHJcblxyXG4gICAgICAgICAgICBpZiAoc2F2ZVZhbHVlQ2hhbmdlZCA9PT0gdmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHByZXZWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHJldkRpc3BsYXlWYWx1ZSA9IHRoaXMuZ2V0TGF5ZXJGcm9tTGlua0lkeChhd2FpdCB0aGlzLmdldEluZGV4T2ZDaG9pY2UocHJldlZhbHVlLCBsaW5lLCBwcmV2TnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHByZXZEaXNwbGF5VmFsdWUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHByZXZEaXNwbGF5VmFsdWVbaV0gPT09IEd1aUNvbnN0YW50cy5ERUZBVUxUX1ZBTFVFX0lOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZEaXNwbGF5VmFsdWVbaV0gPSBHdWlDb25zdGFudHMuREVGQVVMVF9MSVNUX1ZBTFVFO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBpbmRpY2UgPSBNaXNjLkdldEludEFycmF5KHRoaXMuVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgY3VycmVudExheWVyID0gdGhpcy5nZXRDdXJyZW50TGlua0lkeCgpO1xyXG4gICAgICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgbGluZSwgSHRtbFByb3BlcnRpZXMuU2VsZWN0ZWRWYWx1ZSwgaW5kaWNlWzBdLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgbGluZSwgSHRtbFByb3BlcnRpZXMuU2VsZWN0ZWRMYXllciwgY3VycmVudExheWVyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpKSB7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsIGluZGljZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCBsaW5lLCArdGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT046XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUOlxyXG4gICAgICAgICAgaWYgKHRoaXMuSGFzQXV0b2NvbXBsZXRlKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIChmb3JtLmZvcm1SZWZyZXNoZWQoKSB8fCBmb3JjZVJlZnJlc2ggfHwgdmFsRXhwICE9IG51bGwgJiZcclxuICAgICAgICAgICAgLy8gdmFsRXhwLmNvbXB1dGVkQnlDbGllbnRPbmx5KCkpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0SW1hZ2VXaXRoRmlsZU5hbWUodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VGV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTzpcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAoIXZhbHVlQ2hhbmdlZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgdGhpcy5zZXRSYWRpb0NoZWNrZWQodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAvLyBzZXRSYWRpb0NoZWNrZWQodmFsdWUgLmxlbmd0aCgpID09IDAgPyBERUZBVUxUX1ZBTFVFX0lOVCA6IEludGVnZXIucGFyc2VJbnQodmFsdWUpKTtcclxuICAgICAgICAgIC8vIGlmICghdGFzay5zdGFydFByb2Nlc3MoKSlcclxuICAgICAgICAgIC8vIGd1aU1hbmFnZXIuc2V0Rm9jdXModGhpcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5SZWZyZXNoRGlzcGxheVZhbHVlKCkgdW5rbm93biB0eXBlOiB7MH1cIiwgdGhpcy5UeXBlKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSAmJiB2YWx1ZUNoYW5nZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFLCBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCB0cnVlKSwgZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoZXhfMzYwKSB7XHJcbiAgICAgIGlmIChleF8zNjAgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIENvbnRyb2wuUmVmcmVzaERpc3BsYXlWYWx1ZSgpIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4XzM2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KG9ubHlSZXBlYXRhYmxlUHJvcHM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQob25seVJlcGVhdGFibGVQcm9wcykpXHJcbiAgICAgIG9ubHlSZXBlYXRhYmxlUHJvcHMgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlfMShvbmx5UmVwZWF0YWJsZVByb3BzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBjb250cm9sIGluY2x1ZGluZyBpdHMgdmFsdWUgYW5kIGl0cyBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZXBlYXRhYmxlUHJvcHNcIj5pZiBjb250cm9sIHRyZWUgLSByZWZyZXNoZXMgb25seSByZXBlYXRhYmxlIHRyZWUgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBSZWZyZXNoRGlzcGxheV8xKG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAjNDIyMjUwLiBTa2lwIHRoZSByZWZyZXNoIGRpc3BsYXkgb2YgdGhlIHBhcmVudCdzIHN1YmZvcm0gY29udHJvbCBpZiB0aGUgZm9ybSBpbnNpZGUgaXQgaXMgc3RpbGwgaW4gaXRzIFJlZnJlc2hEaXNwbGF5LlxyXG4gICAgaWYgKCEoc3VwZXIuaXNTdWJmb3JtKCkgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkgIT09IG51bGwgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKSkge1xyXG5cclxuICAgICAgLy8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wcyk7XHJcblxyXG4gICAgICAvLyBjb21wdXRlIGFuZCBkaXNwbGF5IHRoZSB2YWx1ZS5cclxuICAgICAgaWYgKHRoaXMuU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleGVjdXRlcyB0aGUgcmVhZG9ubHkgY29tbWFuZCBvbmx5IGlmIG5lZWRlZFxyXG4gICAgICBsZXQgaXNQYXJrYWJsZUN0cmw6IGJvb2xlYW4gPSAhKGF3YWl0IHRoaXMuaXNQYXJrYWJsZShmYWxzZSkpIHx8ICEgYXdhaXQgdGhpcy5pc01vZGlmaWFibGUoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldEN1cnJSZWFkT25seSgpICE9PSBpc1BhcmthYmxlQ3RybCkge1xyXG4gICAgICAgIHRoaXMuU2V0Q3VyclJlYWRPbmx5KGlzUGFya2FibGVDdHJsKTtcclxuICAgICAgICBhd2FpdCBNYW5hZ2VyLlNldFJlYWRPbmx5Q29udHJvbCh0aGlzLCBpc1BhcmthYmxlQ3RybCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtdXN0SW5wdXRQcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCk7XHJcbiAgICAgIC8vIG5lZWQgdG8gY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgY29udHJvbCdzIGRhdGEgaXMgYW4gZXhwcmVzc2lvblxyXG4gICAgICAvLyBvciB0aGUgZm9ybWF0IGlzIGV4cHJlc3Npb24uIFdoZW4gdGhlIGZvcm1hdCBpcyBjaGFuZ2VkLCB0aGUgZGlzcGxheSB2YWwgbWF5IGNoYW5nZSBhcyB3ZWxsLlxyXG4gICAgICBpZiAobXVzdElucHV0UHJvcGVydHkgIT0gbnVsbCAmJiBtdXN0SW5wdXRQcm9wZXJ0eS5pc0V4cHJlc3Npb24oKSkge1xyXG5cclxuICAgICAgICBsZXQgcHJldk11c3RJbnB1dDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAocHJldk11c3RJbnB1dCAhPT0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpKVxyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuTXVzdElucHV0LCAhcHJldk11c3RJbnB1dCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfSU4sIHRydWUpKVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLlRhYkluZGV4LCAtMSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgUmljaCBDbGllbnQgY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgYWx3YXlzLCBhbHNvIGlmIHRoZSBmb3JtIGlzIG5vdCB5ZXQgb3BlbmVkLlxyXG4gIC8vLyBGb3IgT25saW5lIG9ubHkgZm9yIG9wZW5lZCBmb3Jtcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmVmcmVzaGVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjb250cm9sLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25seVJlcGVhdGFibGVQcm9wc1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgcmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUgJiYgdGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcylcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfQVRUUklCVVRFLCB0aGlzLCB0aGlzLkRhdGFUeXBlLmNoYXJDb2RlQXQoMCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdFByb3BzKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuWm9vbUJ1dHRvbkluaXRpYWxpemF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLl9wcm9wVGFiLlJlZnJlc2hEaXNwbGF5KGZhbHNlLCBvbmx5UmVwZWF0YWJsZVByb3BzKSkpIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiQ29udHJvbCAnezB9JzogTm90IGFsbCBwcm9wZXJ0aWVzIGNvdWxkIGJlIHNldFwiLCB0aGlzLmdldE5hbWUoKSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIGlmICghb25seVJlcGVhdGFibGVQcm9wcykge1xyXG4gICAgICAgICAgICB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgbGV0IG1zZzogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKE5TdHJpbmcuRm9ybWF0KFwiQ29udHJvbCAnezB9JzogezF9XCIsIHRoaXMuZ2V0TmFtZSgpLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2cuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoVGFiRm9yTGF5ZXJMaXN0KGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJlbnRMaW5rVmFsdWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgLy8gSWYgdGhlIGZvcm0gaGFzIGFscmVhZHkgb3BlbmVkLCBnZXQgdGhlIGN1cnJlbnQgbGluayB2YWx1ZSBiZWZvcmVcclxuICAgIC8vIGNoYW5naW5nIHRoZSBsYXllciBsaXN0IGkuZS4gYmVmb3JlIGNhbGxpbmcgcmVmcmVzaEFuZFNldEl0ZW1zTGlzdCgpLlxyXG4gICAgLy8gQW5kIHRoZW4sIGFmdGVyIGNoYW5naW5nIHRoZSBsYXllciBsaXN0LCBzZWxlY3QgdGhlIFRBQiBjb3JyZXNwb25kaW5nXHJcbiAgICAvLyB0byB0aGUgY3VycmVudCBsaW5rIHZhbHVlLlxyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpLk9wZW5lZCkge1xyXG4gICAgICBsZXQgaW5kaWNlOiBudW1iZXJbXSA9IHRoaXMuZ2V0Q3VycmVudEluZGV4T2ZDaG9pY2UoKTtcclxuICAgICAgbGV0IGN1cnJlbnRMYXllcjogbnVtYmVyID0gaW5kaWNlWzBdO1xyXG4gICAgICBjdXJyZW50TGlua1ZhbHVlID0gYXdhaXQgdGhpcy5nZXRMaW5rVmFsdWUoY3VycmVudExheWVyLnRvU3RyaW5nKCksIGxpbmUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIGZhbHNlKTtcclxuICAgIGlmICh0aGlzLmdldEZvcm0oKS5PcGVuZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGN1cnJlbnRMaW5rVmFsdWUsIHRoaXMuSXNOdWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBpdGVtIGxpc3Qgb2YgcmFkaW8gYnV0dG9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+RGlzcGxheSBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleGVjQ29tcHV0ZUNob2ljZVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgcmVmcmVzaEFuZFNldEl0ZW1zTGlzdEZvclJhZGlvQnV0dG9uKGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAxLiBjcmVhdGUgdGhlIGJ1dHRvbiBmb3IgZWFjaCBpdGVtcyBsaXN0XHJcbiAgICBsZXQgZGlzcGxheUxpc3Q6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuXHJcbiAgICBsZXQgb3B0aW9ucyA9IGRpc3BsYXlMaXN0Lm1hcCgoZGlzcGxheVZhbHVlLCBjb3VudGVyKSA9PiB7XHJcbiAgICAgIGxldCBpbmRleDogc3RyaW5nID0gY291bnRlci50b1N0cmluZygpO1xyXG4gICAgICByZXR1cm4ge2luZGV4LCBkaXNwbGF5VmFsdWV9XHJcbiAgICB9KTtcclxuICAgIC8vIGNyZWF0ZXMgbmV3IHJhZGlvIGJ1dHRvbnMgZnJvbSBkaXNwbGF5IGxpc3QuXHJcblxyXG4gICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5JdGVtc0xpc3QsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBpdGVtIGxpc3QgYW5kIHNldCBpdCBpbnRvIHRoZSBndWkgY29udHJvbCBpZiBpdCBpcyBjb21ibyBib3ggLCByZWZyZXNoIGFsc28gdGhlIHZpc2libGVcclxuICAvLy8gICBsaW5lc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lOiBudW1iZXIsIGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoZXhlY0NvbXB1dGVDaG9pY2UpIHtcclxuICAgICAgdGhpcy5jbGVhclJhbmdlKGxpbmUpO1xyXG4gICAgfVxyXG4gICAgbGV0IG9wdGlvbnNTdHJpbmdzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMucmVmcmVzaERpc3BSYW5nZShleGVjQ29tcHV0ZUNob2ljZSk7XHJcbiAgICBpZiAoc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCkgfHwgc3VwZXIuaXNUYWJDb250cm9sKCkgfHwgdGhpcy5IYXNBdXRvY29tcGxldGUoKSkge1xyXG5cclxuICAgICAgbGV0IG9wdGlvbnMgPSBvcHRpb25zU3RyaW5ncy5tYXAoKGRpc3BsYXlWYWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICByZXR1cm4ge2luZGV4LCBkaXNwbGF5VmFsdWV9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5JdGVtc0xpc3QsIG9wdGlvbnMpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoc3VwZXIuaXNSYWRpbygpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0Rm9yUmFkaW9CdXR0b24obGluZSwgZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgY2hvaWNlIGxpc3Qgb2YgYSBTRUxFQ1QgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaERpc3BSYW5nZShleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIGxldCBzZWxlY3RDbWQ6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMCk7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuXHJcbiAgICBpZiAobGluZSA8IDApIHtcclxuICAgICAgbGluZSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgbGV0IGRpc3BWYWxzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMuZ2V0RGlzcFZhbHMobGluZSwgZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCkge1xyXG4gICAgICAgIHNlbGVjdENtZCA9IE1nQ29udHJvbEJhc2UuY29tYmluZVN0cmluZ0FycmF5cyhkaXNwVmFscywgZGN2LmdldERpc3BWYWxzKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc2VsZWN0Q21kID0gYXdhaXQgdGhpcy5nZXREaXNwVmFscyhsaW5lLCBleGVjQ29tcHV0ZUNob2ljZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yYW5nZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0T3JkZXJlZERpc3BMaXN0KHNlbGVjdENtZCwgbGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlZnJlc2ggdGhlIGl0ZW1zIGxpc3Qgb2YgdGhlIHNlbGVjdGlvbiBjb250cm9sLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhlY0NvbXB1dGVDaG9pY2VcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgcmVmcmVzaEl0bVJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG5cclxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciBzZWxlY3Rpb24gY29udHJvbC5cclxuICAgIERlYnVnLkFzc2VydCh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKTtcclxuICAgIGxldCBvcmRlcmVkSXRtTGlzdDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigwKTtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgbGlua1ZhbHM6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICBpZiAodGhpcy5faGFzVmFsaWRJdG1BbmREaXNwVmFsKSB7XHJcbiAgICAgIG9yZGVyZWRJdG1MaXN0ID0gTWdDb250cm9sQmFzZS5jb21iaW5lU3RyaW5nQXJyYXlzKGxpbmtWYWxzLCBkY3YuR2V0TGlua1ZhbHMoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0T3JkZXJlZERpc3BMaXN0KG9yZGVyZWRJdG1MaXN0LCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBpdGVtcyB2YWx1ZXMgZnJvbSBkYXRhIHNvdXJjZSAmIGl0ZW0gbGlzdCBwcm9wZXJ0eS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0SXRlbXNSYW5nZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoSXRtUmFuZ2UoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGRpc3BsYXkgdmFsdWVzIGZyb20gZGF0YSBzb3VyY2UgJiBkaXNwbGF5IGxpc3QgcHJvcGVydHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldERpc3BsYXlSYW5nZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0UHJvcHMoKSB7XHJcbiAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSk7XHJcblxyXG4gICAgLy8gRml4ZWQgYnVnIzo3ODE3NDFcclxuICAgIC8vIGluIDEuOSAtLT5cclxuICAgIC8vIHdoZW4gYXNrIGFib3V0IGFueSBwcm9wZXJ0eShQUk9QX1RZUEVfRU5BQkxFRCkgd2Ugd2FzIGNyZWF0ZWQgdGhlIGRlZmF1bHQgcHJvcGVydHkgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSh0cnVlKS5cclxuICAgIC8vIGFuZCB3aGVuIGdldCB0byBSZWZyZXNoUHJvcHMgb2YgdGhlIHByb3BlcnR5IFwiUFJPUF9UWVBFX0VOQUJMRURcIiB3ZSB3YXMgYWRkIGNvbW1hbmQgdG8gdGhlIHF1ZXVlIGluIGd1aSB0aHJlYWRcclxuICAgIC8vIHRoZSBjb21tYW5kIHdhcyB3YXMgdXBkYXRlIHRoZSBUYWdEYXRhLkVuYWJsZSB0byBiZSBcInRydWVcIlxyXG4gICAgLy8gaW4gMi4wIC0tPlxyXG4gICAgLy8gd2UgdXNlaW5nIGEgbmV3IG1ldGhvZCBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eSgpIHRoYXQgbm90IGNyZWF0ZWQgYW55IGRlZmF1bHQgcHJvcGVydHkgYW5kIG5vIGdldCB0byByZWZyZXNoUHJvcFxyXG4gICAgLy8gb24gdGhlIHByb3BlcnR5IGFuZCB0aGUgdmFsdWUgb24gdGhlIENvbnRyb2wuRW5hYmxlIHdhcyB3cm9uZ1xyXG4gICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQpO1xyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IExpbmtlZCBQYXJlbnQgSWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5rZWRQYXJlbnREaXRJZHhcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0TGlua2VkUGFyZW50SWR4KGxpbmtlZFBhcmVudERpdElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggPSBsaW5rZWRQYXJlbnREaXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB2YWxpZGF0aW9uIGRldGFpbHMgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZFZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGJ1aWxkUGljdHVyZShvbGRWYWw6IGFueSwgdmFsOiBhbnkpOiBWYWxpZGF0aW9uRGV0YWlscyB7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkgfHwgc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9waWNFeHBFeGlzdHMpIHtcclxuICAgICAgdGhpcy5fdmQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3ZkID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZkID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzKG9sZFZhbCwgdmFsLCB0aGlzLl9yYW5nZSwgdGhpcy5fcGljLCB0aGlzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl92ZC5zZXRWYWx1ZSh2YWwpO1xyXG4gICAgICB0aGlzLl92ZC5zZXRPbGRWYWx1ZShvbGRWYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl92ZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVja3MgaWYgdGhlIHNlbnQgdmFsdWUgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGNvbnRyb2wncyBleGlzdGluZyB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiTmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2hlY2tOdWxsVmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEaWZmZXJlbnRWYWx1ZShuZXdWYWx1ZTogYW55LCBpc051bGw6IGJvb2xlYW4sIGNoZWNrTnVsbFZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IGN0cmxDdXJyVmFsdWU6IGFueSA9IHRoaXMuVmFsdWU7XHJcbiAgICBsZXQgdmFsQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSlcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIXRoaXMuQ29tcGFyZURhdGUobmV3VmFsdWUsIGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICF0aGlzLkNvbXBhcmVUaW1lKG5ld1ZhbHVlLCBjdHJsQ3VyclZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG5ld1ZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSAmJiB0eXBlb2YgY3RybEN1cnJWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBsZXQgbmV3VmFsdWVzdHIgPSBuZXdWYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAobmV3VmFsdWVzdHIgIT09IGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAobmV3VmFsdWUgIT09IGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25DdHJsKCkgJiYgdHlwZW9mIGN0cmxDdXJyVmFsdWUgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpKSB7XHJcbiAgICAgICAgbGV0IG5ld1ZhbHVlU3RyID0gbmV3VmFsdWUuam9pbignLCcpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICEoU3RyVXRpbC5ydHJpbShuZXdWYWx1ZVN0cikgPT09IFN0clV0aWwucnRyaW0oY3RybEN1cnJWYWx1ZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBjdHJsQ3VycklzTnVsbDogYm9vbGVhbiA9IHRoaXMuSXNOdWxsO1xyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhKFN0clV0aWwucnRyaW0obmV3VmFsdWUpID09PSBTdHJVdGlsLnJ0cmltKGN0cmxDdXJyVmFsdWUpKTtcclxuICAgICAgICBpZiAoIXZhbENoYW5nZWQgJiYgY2hlY2tOdWxsVmFsdWUpIHtcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSAoaXNOdWxsICE9PSBjdHJsQ3VycklzTnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIENvbXBhcmVEYXRlKGQxOiBEYXRlLCBkMjogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldHZhbDogYm9vbGVhbjtcclxuICAgIGlmIChkMSA9PT0gbnVsbCAmJiBkMiA9PT0gbnVsbClcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKChkMSA9PT0gbnVsbCAmJiBkMiAhPT0gbnVsbCkgfHwgKGQxICE9PSBudWxsICYmIGQyID09PSBudWxsKSlcclxuICAgICAgcmV0dmFsID0gZmFsc2U7XHJcbiAgICBlbHNlIGlmIChkMS5nZXRGdWxsWWVhcigpID09PSBkMi5nZXRGdWxsWWVhcigpXHJcbiAgICAgICYmIGQxLmdldERhdGUoKSA9PT0gZDIuZ2V0RGF0ZSgpXHJcbiAgICAgICYmIGQxLmdldE1vbnRoKCkgPT09IGQyLmdldE1vbnRoKCkpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG4gIH1cclxuXHJcbiAgQ29tcGFyZVRpbWUoZDE6IERhdGUsIGQyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0dmFsOiBib29sZWFuO1xyXG4gICAgaWYgKGQxID09PSBudWxsICYmIGQyID09PSBudWxsKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoKGQxID09PSBudWxsICYmIGQyICE9PSBudWxsKSB8fCAoZDEgIT09IG51bGwgJiYgZDIgPT09IG51bGwpKVxyXG4gICAgICByZXR2YWwgPSBmYWxzZTtcclxuICAgIGVsc2UgaWYgKGQxLmdldEhvdXJzKCkgPT09IGQyLmdldEhvdXJzKClcclxuICAgICAgJiYgZDEuZ2V0TWludXRlcygpID09PSBkMi5nZXRNaW51dGVzKClcclxuICAgICAgJiYgZDEuZ2V0U2Vjb25kcygpID09PSBkMi5nZXRTZWNvbmRzKCkpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgY29sdW1uJ3Mgc29ydGFibGUgcHJvcGVydHkgaXMgc2V0IHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDb2x1bW5Tb3J0YWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1NvcnRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmIHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTikpIHtcclxuICAgICAgaXNTb3J0YWJsZSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTikuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNTb3J0YWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGZpcnN0IGNoaWxkIE1nQ29udHJvbCBvZiBjb2x1bW4gaS5lLiBmaWVsZCBhdHRhY2hlZCB0byBjb2x1bW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcblxyXG4gIGdldENvbHVtbkNoaWxkQ29udHJvbCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmICh0aGlzLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTilcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgbGV0IGxpbmtlZENvbnRyb2xzOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gdGhpcy5fcGFyZW50VGFibGUuZ2V0TGlua2VkQ29udHJvbHMoKTtcclxuXHJcbiAgICByZXR1cm4gbGlua2VkQ29udHJvbHMuZmluZCgoY29udHJvbDogTWdDb250cm9sQmFzZSkgPT4gKGNvbnRyb2wuZ2V0TGF5ZXIoKSA9PT0gdGhpcy5nZXRMYXllcigpICYmIGNvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmICFjb250cm9sLklzVGFibGVIZWFkZXJDaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBjb250cm9sIG5hbWUgZm9yIGhhbmRsZXIgc2VhcmNoIHByb3Bvc2UuXHJcbiAgLy8vICAgVGhlIGNvbnRyb2wgaXRzZWxmLCBtYXkgbm90IGhhdmUgYSBuYW1lIGZvciBoYW5kbGVyIHNlYXJjaCAobGlrZSBjb2x1bW4gY29udHJvbCwgaW4gd2hpY2ggd2UgbmVlZCB0byB1c2VcclxuICAvLy8gICB0aGUgY2hpbGQgY29udHJvbCBuYW1lIGZvciBoYW5kbGVycyBzZWFyY2gpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbnRyb2xOYW1lRm9ySGFuZGxlclNlYXJjaCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNoaWxkQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nO1xyXG4gICAgaWYgKGNoaWxkQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gY2hpbGRDb250cm9sLk5hbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgY29udHJvbCB0byB0aGUgbGlzdCBvZiBsaW5rZWQgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgbGlua0N0cmwoY3RybDogTWdDb250cm9sQmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fbGlua2VkQ29udHJvbHMucHVzaChjdHJsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBjb250cm9sIGZyb20gdGhlIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVSZWZGcm9tRmllbGQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmllbGQuUmVtb3ZlQ29udHJvbCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBkaXQgaW5kZXggb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERpdElkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RpdElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyBkY1ZhbElkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkY1ZhbElkXCI+PC9wYXJhbT5cclxuICBzZXREY1ZhbElkKGRjVmFsSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGNWYWxJZCA9IGRjVmFsSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaWYgdGhlIHBpY3R1cmUgZGVmaW5lIGFzIGhlYnJldyB0aGVuIHNldCB0aGUgbGFuZyB0byBoZWJyZXcsIG90aGVyd2lzZSByZXN0b3JlIHRoZSBsYW5nXHJcbiAgLy8vICAgVGhlIHNhbWUgd2UgZG9pbmcgZm9yIG9ubGluZSA6ZWR0X2VkaXQuY3BwIDogU2V0S2V5Ym9hcmRMYW5ndWFnZSgpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlc3RvcmVMYW5nXCI+PC9wYXJhbT5cclxuICBTZXRLZXlib2FyZExhbmd1YWdlKCk6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5pdGlhbGl6ZSBjb250cm9sIHByb3BlcnRpZXMgZm9yIGRlcml2ZWQgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KGludGVybmFsKVxyXG4gIC8vLyBjaGVja3MgaWYgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBJc1BhcmthYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaXNQYXJrYWJsZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4oaW50ZXJuYWwpXHJcbiAgLy8vIGNoZWNrcyBpZiBjb250cm9sIGhhcyBleHByZXNzaW9uIG9yIFBhcmVudCB0YXNrIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEhhc0V4cE9yUGFyZW50VGFza0ZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgcmV0dXJuICh0aGlzLmdldEZpZWxkKCkgPT09IG51bGwgfHwgdGhpcy5nZXRGaWVsZCgpLmdldFRhc2soKSAhPT0gdGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjb250cm9sIGlzIHBhcmthYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrRW5hYmxlZEFuZFZpc2libGVcIj5jaGVjayBlbmFibGVkIGFuZCB2aXNpYmxlIHByb3BlcnRpZXMgdG9vPC9wYXJhbT5cclxuICBhc3luYyBpc1BhcmthYmxlKGNoZWNrRW5hYmxlZEFuZFZpc2libGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgcmVzdWx0ID0gIXN1cGVyLmlzVGFibGVDb250cm9sKCkgJiYgIXN1cGVyLmlzQ29sdW1uQ29udHJvbCgpO1xyXG5cclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSAtPiBub3QgcGFya2FibGUuXHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIHJlc3VsdCA9IHRhc2suSXNJbnRlcmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0ICYmIHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkgJiYgdGhpcy5fZmllbGQgIT09IG51bGwgJiYgdGhpcy5fZmllbGQuUGFydE9mRGF0YXZpZXcpIHtcclxuICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIC8vIFFDUiAjNDQxMTc3LiBXaGVuIHdlIGNoZWNrIHRoZSBzdWJmb3JtIHBhcmsgYWJpbGl0eSwgd2UgbmVlZCB0byBjaGVjayBhbHNvIGl0J3MgdmlzaWJpbGl0eSBhbmQgZW5hYmxlIHByb3BlcnRpZXMuXHJcbiAgICAgIGlmICghc3VwZXIuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgIHJlc3VsdCA9ICgodGhpcy5fZmllbGQgIT09IG51bGwgJiYgdGhpcy5fZmllbGQuZ2V0VGFzaygpID09PSB0YXNrKSB8fCB0aGlzLmlzQnV0dG9uKCkgfHwgc3VwZXIuaXNCcm93c2VyQ29udHJvbCgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVzdWx0ICYmIGNoZWNrRW5hYmxlZEFuZFZpc2libGUpIHtcclxuICAgICAgICByZXN1bHQgPSAodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmlzVmlzaWJsZSgpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKChyZXN1bHQgJiYgdGhpcy5fcGFyZW50VGFibGUgIT09IG51bGwpICYmIGNoZWNrRW5hYmxlZEFuZFZpc2libGUpIHtcclxuICAgICAgICByZXN1bHQgPSAodGhpcy5fcGFyZW50VGFibGUuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCwgdHJ1ZSkgJiYgdGhpcy5fcGFyZW50VGFibGUuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSwgdHJ1ZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSYWlzZSBBQ1RfQ1RSTF9ISVQgb24gbGVmdCBtb3VzZSBjbGljayBpZiBpdCBtZWV0cyBmb2xsb3dpbmcgY29uZGl0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBSYWlzZUNvbnRyb2xIaXRPbkxlZnRDbGlja09mTW91c2VEb3duKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJhaXNlQ3RybEhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKCFzdXBlci5Jc0h5cGVyVGV4dEJ1dHRvbigpICYmICFzdXBlci5pc1JhZGlvKCkgJiYgIXN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgIHJhaXNlQ3RybEhpdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmFpc2VDdHJsSGl0O1xyXG4gIH1cclxuXHJcbiAgR2V0VmFySW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSAnQ29udHJvbCBIaXQnIGV2ZW50IHNob3VsZCBiZSByYWlzZWQgb24gbW91c2UgZG93bi5cclxuICAvLy8gVGhlIG1ldGhvZCB3YXMgZXh0cmFjdGVkIGZyb20gcHJvY2Vzc01vdXNlRG93biwgc2luY2Ugd2UgbWlnaHQgaGF2ZSBkaWZmZXJlbnRcclxuICAvLy8gYmVoYXZpb3JzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgdHJlZSBjb250cm9scy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlZnRDbGlja1dhc1ByZXNzZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmFpc2VDb250cm9sSGl0T25Nb3VzZURvd24obGVmdENsaWNrV2FzUHJlc3NlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJhaXNlQ3RybEhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKGxlZnRDbGlja1dhc1ByZXNzZWQpIHtcclxuICAgICAgaWYgKHRoaXMuUmFpc2VDb250cm9sSGl0T25MZWZ0Q2xpY2tPZk1vdXNlRG93bigpKSB7XHJcbiAgICAgICAgcmFpc2VDdHJsSGl0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhaXNlQ3RybEhpdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSGFuZGxlIE1HX0FDVF9ISVQgb24gdGhlIHN1YmZvcm0gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgT25TdWJmb3JtQ2xpY2soKTogdm9pZCB7XHJcbiAgICBNYW5hZ2VyLkV2ZW50c01hbmFnZXIuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGUodGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSElUKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyBNZ0Zvcm0gb2YgdGhlIHN1YmZvcm0gY29udHJvbCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRTdWJmb3JtTWdGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBQcm9wZXJ0eUV4aXN0cyhpZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvcFRhYi5wcm9wRXhpc3RzKGlkKTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJ7XCIgKyB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIjogXCIgKyBNZ0NvbnRyb2xUeXBlW3RoaXMuVHlwZV0gKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIGlmIG5ldyBkYXRlIGlzIDA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj4gVGhlIHZhbHVlIHRvIGNoZWNrPC9wYXJhbT5cclxuICBpc0RhdGVaZXJvKHZhbDogRGF0ZSkge1xyXG4gICAgbGV0IHplcm9EYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICBpZiAodmFsLmdldE1vbnRoKCkgPT09IDAgJiYgdmFsLmdldEZ1bGxZZWFyKCkgPT09IDAgJiYgdmFsLmdldERheSgpID09PSAwKVxyXG4gICAgICAgIHplcm9EYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB6ZXJvRGF0ZTtcclxuICB9XHJcblxyXG4gIElzRGVmYXVsdFJvdXRlck91dGxldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNICYmIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX09VVExFVCwgZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIElzUm91dGVyT3V0bGV0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0gJiYgdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX1JPVVRFUl9PVVRMRVQsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBab29tQnV0dG9uSW5pdGlhbGl6YXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc1RleHRDb250cm9sKCkgJiYgdGhpcy5jaGVja0lmRXhpc3RQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0wpKVxyXG4gICAge1xyXG4gICAgICBsZXQgY29ubmVjdGVkQnV0dG9uOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5Gb3JtLkN0cmxUYWIuR2V0Q29udHJvbEJ5SXNuKChhd2FpdCAoYXdhaXQgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0wpKS5nZXRWYWx1ZUludCgpKSk7XHJcblxyXG4gICAgICAvLyBpbWFnZSBidXR0b24gLSBjYWxjdWxhdGUgYWNjb3JkaW5nIHRvIGltYWdlXHJcbiAgICAgIGxldCBpbWFnZUZpbGVOYW1lIDogc3RyaW5nICA9IG51bGw7XHJcbiAgICAgIGlmIChjb25uZWN0ZWRCdXR0b24uSXNJbWFnZUJ1dHRvbigpICYmIGNvbm5lY3RlZEJ1dHRvbi5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkpXHJcbiAgICAgIHtcclxuICAgICAgICBpbWFnZUZpbGVOYW1lID0gYXdhaXQoYXdhaXQgY29ubmVjdGVkQnV0dG9uLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpKS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmICghTWlzYy5Jc1dlYlVybChpbWFnZUZpbGVOYW1lKSlcclxuICAgICAgICAgIGltYWdlRmlsZU5hbWUgPSBcIi4vYXNzZXRzL2ltYWdlcy9cIiArIGltYWdlRmlsZU5hbWU7XHJcbiAgICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9TVFlMRSwgdGhpcywgMCwgTWFnaWNQcm9wZXJ0aWVzLkltYWdlRmlsZSwgaW1hZ2VGaWxlTmFtZSk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzdG9yZSB0aGUgZWRpdCBjb250cm9sIG9uIHRoZSBidXR0b25cclxuICAgICAgdGhpcy5Db25uZWN0ZWRDb250cm9sID0gY29ubmVjdGVkQnV0dG9uO1xyXG4gICAgICBjb25uZWN0ZWRCdXR0b24uQ29ubmVjdGVkQ29udHJvbCA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|