UNPKG

aws-cdk-neuronx-patterns

Version:
161 lines 21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const aws_cdk_lib_1 = require("aws-cdk-lib"); const neuronx_instance_type_1 = require("./neuronx-instance-type"); describe("Inferentia2Chips", () => { const inferentia2Chips = new neuronx_instance_type_1.Inferentia2Chips(12); it("chips as is number", () => { expect(inferentia2Chips.chips).toBe(12); }); it("NeuronxCores is twice of chips", () => { expect(inferentia2Chips.neuronxCores).toBe(24); }); it("AcceleratorMemory is 16 times more than Neuron core", () => { expect(inferentia2Chips.acceleratorMemory).toStrictEqual(aws_cdk_lib_1.Size.gibibytes(384)); }); }); // https://aws.amazon.com/ec2/instance-types/trn2/ describe("Trainium2Chips", () => { describe("single chip", () => { const trainium2Chips = new neuronx_instance_type_1.Trainium2Chips(1); it("chips as is number", () => { expect(trainium2Chips.chips).toBe(1); }); it("NeuronxCores is 4 per chip (LNC=2 default)", () => { expect(trainium2Chips.neuronxCores).toBe(4); }); it("AcceleratorMemory is 24 GiB per logical core", () => { expect(trainium2Chips.acceleratorMemory).toStrictEqual(aws_cdk_lib_1.Size.gibibytes(96)); }); }); describe("16 chips (trn2.48xlarge)", () => { const trainium2Chips = new neuronx_instance_type_1.Trainium2Chips(16); it("chips as is number", () => { expect(trainium2Chips.chips).toBe(16); }); it("NeuronxCores is 64 for 16 chips (LNC=2 default)", () => { expect(trainium2Chips.neuronxCores).toBe(64); }); it("AcceleratorMemory is 1536 GiB for 16 chips", () => { expect(trainium2Chips.acceleratorMemory).toStrictEqual(aws_cdk_lib_1.Size.gibibytes(1536)); }); }); }); // https://aws.amazon.com/ec2/instance-types/inf2/?nc1=h_ls describe("NeuronxInstanceType", () => { const instanceTypes = [ [ neuronx_instance_type_1.NeuronxInstanceType.INF2_XLARGE, { instanceType: "inf2.xlarge", vCpu: 4, memory: aws_cdk_lib_1.Size.gibibytes(16), acceleratorChips: { chips: 1, neuronxCores: 2, acceleratorMemory: aws_cdk_lib_1.Size.gibibytes(32), }, }, ], [ neuronx_instance_type_1.NeuronxInstanceType.INF2_8XLARGE, { instanceType: "inf2.8xlarge", vCpu: 32, memory: aws_cdk_lib_1.Size.gibibytes(128), acceleratorChips: { chips: 1, neuronxCores: 2, acceleratorMemory: aws_cdk_lib_1.Size.gibibytes(32), }, }, ], [ neuronx_instance_type_1.NeuronxInstanceType.INF2_24XLARGE, { instanceType: "inf2.24xlarge", vCpu: 96, memory: aws_cdk_lib_1.Size.gibibytes(384), acceleratorChips: { chips: 6, neuronxCores: 12, acceleratorMemory: aws_cdk_lib_1.Size.gibibytes(192), }, }, ], [ neuronx_instance_type_1.NeuronxInstanceType.INF2_48XLARGE, { instanceType: "inf2.48xlarge", vCpu: 192, memory: aws_cdk_lib_1.Size.gibibytes(768), acceleratorChips: { chips: 12, neuronxCores: 24, acceleratorMemory: aws_cdk_lib_1.Size.gibibytes(384), }, }, ], ]; it.each(instanceTypes)("InstanceType of %s", (instanceType, expected) => { expect(instanceType.toString()).toBe(expected.instanceType); expect(instanceType.vCpu).toBe(expected.vCpu); expect(instanceType.memory).toStrictEqual(expected.memory); expect(instanceType.acceleratorChips.chips).toBe(expected.acceleratorChips.chips); expect(instanceType.acceleratorChips.neuronxCores).toBe(expected.acceleratorChips.neuronxCores); expect(instanceType.acceleratorChips.acceleratorMemory).toStrictEqual(expected.acceleratorChips.acceleratorMemory); }); }); // https://aws.amazon.com/ec2/instance-types/trn2/ describe("NeuronxInstanceType Trn2", () => { const instanceTypes = [ [ neuronx_instance_type_1.NeuronxInstanceType.TRN2_3XLARGE, { instanceType: "trn2.3xlarge", vCpu: 12, memory: aws_cdk_lib_1.Size.gibibytes(128), acceleratorChips: { chips: 1, neuronxCores: 4, acceleratorMemory: aws_cdk_lib_1.Size.gibibytes(96), }, }, ], [ neuronx_instance_type_1.NeuronxInstanceType.TRN2_48XLARGE, { instanceType: "trn2.48xlarge", vCpu: 192, memory: aws_cdk_lib_1.Size.gibibytes(2048), acceleratorChips: { chips: 16, neuronxCores: 64, acceleratorMemory: aws_cdk_lib_1.Size.gibibytes(1536), }, }, ], [ neuronx_instance_type_1.NeuronxInstanceType.TRN2U_48XLARGE, { instanceType: "trn2u.48xlarge", vCpu: 192, memory: aws_cdk_lib_1.Size.gibibytes(2048), acceleratorChips: { chips: 16, neuronxCores: 64, acceleratorMemory: aws_cdk_lib_1.Size.gibibytes(1536), }, }, ], ]; it.each(instanceTypes)("InstanceType of %s", (instanceType, expected) => { expect(instanceType.toString()).toBe(expected.instanceType); expect(instanceType.vCpu).toBe(expected.vCpu); expect(instanceType.memory).toStrictEqual(expected.memory); expect(instanceType.acceleratorChips.chips).toBe(expected.acceleratorChips.chips); expect(instanceType.acceleratorChips.neuronxCores).toBe(expected.acceleratorChips.neuronxCores); expect(instanceType.acceleratorChips.acceleratorMemory).toStrictEqual(expected.acceleratorChips.acceleratorMemory); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV1cm9ueC1pbnN0YW5jZS10eXBlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFzZS9uZXVyb254L25ldXJvbngtaW5zdGFuY2UtdHlwZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQW1DO0FBQ25DLG1FQUtpQztBQUVqQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSx3Q0FBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRCxFQUFFLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQzVCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1FBQzdELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLGFBQWEsQ0FDdEQsa0JBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQ3BCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsa0RBQWtEO0FBQ2xELFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxzQ0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7WUFDNUIsTUFBTSxDQUFD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QVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUM5QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUNoQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQ3JELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQ3ZDLENBQUM7UUFDRixNQUFNLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsYUFBYSxDQUNuRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQzVDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2l6ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgSUFjY2VsZXJhdG9yQ2hpcHMsXG4gIEluZmVyZW50aWEyQ2hpcHMsXG4gIFRyYWluaXVtMkNoaXBzLFxuICBOZXVyb254SW5zdGFuY2VUeXBlLFxufSBmcm9tIFwiLi9uZXVyb254LWluc3RhbmNlLXR5cGVcIjtcblxuZGVzY3JpYmUoXCJJbmZlcmVudGlhMkNoaXBzXCIsICgpID0+IHtcbiAgY29uc3QgaW5mZXJlbnRpYTJDaGlwcyA9IG5ldyBJbmZlcmVudGlhMkNoaXBzKDEyKTtcbiAgaXQoXCJjaGlwcyBhcyBpcyBudW1iZXJcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChpbmZlcmVudGlhMkNoaXBzLmNoaXBzKS50b0JlKDEyKTtcbiAgfSk7XG4gIGl0KFwiTmV1cm9ueENvcmVzIGlzIHR3aWNlIG9mIGNoaXBzXCIsICgpID0+IHtcbiAgICBleHBlY3QoaW5mZXJlbnRpYTJDaGlwcy5uZXVyb254Q29yZXMpLnRvQmUoMjQpO1xuICB9KTtcbiAgaXQoXCJBY2NlbGVyYXRvck1lbW9yeSBpcyAxNiB0aW1lcyBtb3JlIHRoYW4gTmV1cm9uIGNvcmVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChpbmZlcmVudGlhMkNoaXBzLmFjY2VsZXJhdG9yTWVtb3J5KS50b1N0cmljdEVxdWFsKFxuICAgICAgU2l6ZS5naWJpYnl0ZXMoMzg0KSxcbiAgICApO1xuICB9KTtcbn0pO1xuXG4vLyBodHRwczovL2F3cy5hbWF6b24uY29tL2VjMi9pbnN0YW5jZS10eXBlcy90cm4yL1xuZGVzY3JpYmUoXCJUcmFpbml1bTJDaGlwc1wiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwic2luZ2xlIGNoaXBcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHRyYWluaXVtMkNoaXBzID0gbmV3IFRyYWluaXVtMkNoaXBzKDEpO1xuICAgIGl0KFwiY2hpcHMgYXMgaXMgbnVtYmVyXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0cmFpbml1bTJDaGlwcy5jaGlwcykudG9CZSgxKTtcbiAgICB9KTtcbiAgICBpdChcIk5ldXJvbnhDb3JlcyBpcyA0IHBlciBjaGlwIChMTkM9MiBkZWZhdWx0KVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QodHJhaW5pdW0yQ2hpcHMubmV1cm9ueENvcmVzKS50b0JlKDQpO1xuICAgIH0pO1xuICAgIGl0KFwiQWNjZWxlcmF0b3JNZW1vcnkgaXMgMjQgR2lCIHBlciBsb2dpY2FsIGNvcmVcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRyYWluaXVtMkNoaXBzLmFjY2VsZXJhdG9yTWVtb3J5KS50b1N0cmljdEVxdWFsKFxuICAgICAgICBTaXplLmdpYmlieXRlcyg5NiksXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoXCIxNiBjaGlwcyAodHJuMi40OHhsYXJnZSlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHRyYWluaXVtMkNoaXBzID0gbmV3IFRyYWluaXVtMkNoaXBzKDE2KTtcbiAgICBpdChcImNoaXBzIGFzIGlzIG51bWJlclwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QodHJhaW5pdW0yQ2hpcHMuY2hpcHMpLnRvQmUoMTYpO1xuICAgIH0pO1xuICAgIGl0KFwiTmV1cm9ueENvcmVzIGlzIDY0IGZvciAxNiBjaGlwcyAoTE5DPTIgZGVmYXVsdClcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRyYWluaXVtMkNoaXBzLm5ldXJvbnhDb3JlcykudG9CZSg2NCk7XG4gICAgfSk7XG4gICAgaXQoXCJBY2NlbGVyYXRvck1lbW9yeSBpcyAxNTM2IEdpQiBmb3IgMTYgY2hpcHNcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRyYWluaXVtMkNoaXBzLmFjY2VsZXJhdG9yTWVtb3J5KS50b1N0cmljdEVxdWFsKFxuICAgICAgICBTaXplLmdpYmlieXRlcygxNTM2KSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbi8vIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vZWMyL2luc3RhbmNlLXR5cGVzL2luZjIvP25jMT1oX2xzXG5kZXNjcmliZShcIk5ldXJvbnhJbnN0YW5jZVR5cGVcIiwgKCkgPT4ge1xuICBjb25zdCBpbnN0YW5jZVR5cGVzID0gW1xuICAgIFtcbiAgICAgIE5ldXJvbnhJbnN0YW5jZVR5cGUuSU5GMl9YTEFSR0UsXG4gICAgICB7XG4gICAgICAgIGluc3RhbmNlVHlwZTogXCJpbmYyLnhsYXJnZVwiLFxuICAgICAgICB2Q3B1OiA0LFxuICAgICAgICBtZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDE2KSxcbiAgICAgICAgYWNjZWxlcmF0b3JDaGlwczoge1xuICAgICAgICAgIGNoaXBzOiAxLFxuICAgICAgICAgIG5ldXJvbnhDb3JlczogMixcbiAgICAgICAgICBhY2NlbGVyYXRvck1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMzIpLFxuICAgICAgICB9IHNhdGlzZmllcyBJQWNjZWxlcmF0b3JDaGlwcyxcbiAgICAgIH0sXG4gICAgXSBhcyBjb25zdCxcbiAgICBbXG4gICAgICBOZXVyb254SW5zdGFuY2VUeXBlLklORjJfOFhMQVJHRSxcbiAgICAgIHtcbiAgICAgICAgaW5zdGFuY2VUeXBlOiBcImluZjIuOHhsYXJnZVwiLFxuICAgICAgICB2Q3B1OiAzMixcbiAgICAgICAgbWVtb3J5OiBTaXplLmdpYmlieXRlcygxMjgpLFxuICAgICAgICBhY2NlbGVyYXRvckNoaXBzOiB7XG4gICAgICAgICAgY2hpcHM6IDEsXG4gICAgICAgICAgbmV1cm9ueENvcmVzOiAyLFxuICAgICAgICAgIGFjY2VsZXJhdG9yTWVtb3J5OiBTaXplLmdpYmlieXRlcygzMiksXG4gICAgICAgIH0gc2F0aXNmaWVzIElBY2NlbGVyYXRvckNoaXBzLFxuICAgICAgfSxcbiAgICBdIGFzIGNvbnN0LFxuICAgIFtcbiAgICAgIE5ldXJvbnhJbnN0YW5jZVR5cGUuSU5GMl8yNFhMQVJHRSxcbiAgICAgIHtcbiAgICAgICAgaW5zdGFuY2VUeXBlOiBcImluZjIuMjR4bGFyZ2VcIixcbiAgICAgICAgdkNwdTogOTYsXG4gICAgICAgIG1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMzg0KSxcbiAgICAgICAgYWNjZWxlcmF0b3JDaGlwczoge1xuICAgICAgICAgIGNoaXBzOiA2LFxuICAgICAgICAgIG5ldXJvbnhDb3JlczogMTIsXG4gICAgICAgICAgYWNjZWxlcmF0b3JNZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDE5MiksXG4gICAgICAgIH0gc2F0aXNmaWVzIElBY2NlbGVyYXRvckNoaXBzLFxuICAgICAgfSxcbiAgICBdIGFzIGNvbnN0LFxuICAgIFtcbiAgICAgIE5ldXJvbnhJbnN0YW5jZVR5cGUuSU5GMl80OFhMQVJHRSxcbiAgICAgIHtcbiAgICAgICAgaW5zdGFuY2VUeXBlOiBcImluZjIuNDh4bGFyZ2VcIixcbiAgICAgICAgdkNwdTogMTkyLFxuICAgICAgICBtZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDc2OCksXG4gICAgICAgIGFjY2VsZXJhdG9yQ2hpcHM6IHtcbiAgICAgICAgICBjaGlwczogMTIsXG4gICAgICAgICAgbmV1cm9ueENvcmVzOiAyNCxcbiAgICAgICAgICBhY2NlbGVyYXRvck1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMzg0KSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgSUFjY2VsZXJhdG9yQ2hpcHMsXG4gICAgICB9LFxuICAgIF0gYXMgY29uc3QsXG4gIF07XG4gIGl0LmVhY2goaW5zdGFuY2VUeXBlcykoXCJJbnN0YW5jZVR5cGUgb2YgJXNcIiwgKGluc3RhbmNlVHlwZSwgZXhwZWN0ZWQpID0+IHtcbiAgICBleHBlY3QoaW5zdGFuY2VUeXBlLnRvU3RyaW5nKCkpLnRvQmUoZXhwZWN0ZWQuaW5zdGFuY2VUeXBlKTtcbiAgICBleHBlY3QoaW5zdGFuY2VUeXBlLnZDcHUpLnRvQmUoZXhwZWN0ZWQudkNwdSk7XG4gICAgZXhwZWN0KGluc3RhbmNlVHlwZS5tZW1vcnkpLnRvU3RyaWN0RXF1YWwoZXhwZWN0ZWQubWVtb3J5KTtcbiAgICBleHBlY3QoaW5zdGFuY2VUeXBlLmFjY2VsZXJhdG9yQ2hpcHMuY2hpcHMpLnRvQmUoXG4gICAgICBleHBlY3RlZC5hY2NlbGVyYXRvckNoaXBzLmNoaXBzLFxuICAgICk7XG4gICAgZXhwZWN0KGluc3RhbmNlVHlwZS5hY2NlbGVyYXRvckNoaXBzLm5ldXJvbnhDb3JlcykudG9CZShcbiAgICAgIGV4cGVjdGVkLmFjY2VsZXJhdG9yQ2hpcHMubmV1cm9ueENvcmVzLFxuICAgICk7XG4gICAgZXhwZWN0KGluc3RhbmNlVHlwZS5hY2NlbGVyYXRvckNoaXBzLmFjY2VsZXJhdG9yTWVtb3J5KS50b1N0cmljdEVxdWFsKFxuICAgICAgZXhwZWN0ZWQuYWNjZWxlcmF0b3JDaGlwcy5hY2NlbGVyYXRvck1lbW9yeSxcbiAgICApO1xuICB9KTtcbn0pO1xuXG4vLyBodHRwczovL2F3cy5hbWF6b24uY29tL2VjMi9pbnN0YW5jZS10eXBlcy90cm4yL1xuZGVzY3JpYmUoXCJOZXVyb254SW5zdGFuY2VUeXBlIFRybjJcIiwgKCkgPT4ge1xuICBjb25zdCBpbnN0YW5jZVR5cGVzID0gW1xuICAgIFtcbiAgICAgIE5ldXJvbnhJbnN0YW5jZVR5cGUuVFJOMl8zWExBUkdFLFxuICAgICAge1xuICAgICAgICBpbnN0YW5jZVR5cGU6IFwidHJuMi4zeGxhcmdlXCIsXG4gICAgICAgIHZDcHU6IDEyLFxuICAgICAgICBtZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDEyOCksXG4gICAgICAgIGFjY2VsZXJhdG9yQ2hpcHM6IHtcbiAgICAgICAgICBjaGlwczogMSxcbiAgICAgICAgICBuZXVyb254Q29yZXM6IDQsXG4gICAgICAgICAgYWNjZWxlcmF0b3JNZW1vcnk6IFNpemUuZ2liaWJ5dGVzKDk2KSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgSUFjY2VsZXJhdG9yQ2hpcHMsXG4gICAgICB9LFxuICAgIF0gYXMgY29uc3QsXG4gICAgW1xuICAgICAgTmV1cm9ueEluc3RhbmNlVHlwZS5UUk4yXzQ4WExBUkdFLFxuICAgICAge1xuICAgICAgICBpbnN0YW5jZVR5cGU6IFwidHJuMi40OHhsYXJnZVwiLFxuICAgICAgICB2Q3B1OiAxOTIsXG4gICAgICAgIG1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMjA0OCksXG4gICAgICAgIGFjY2VsZXJhdG9yQ2hpcHM6IHtcbiAgICAgICAgICBjaGlwczogMTYsXG4gICAgICAgICAgbmV1cm9ueENvcmVzOiA2NCxcbiAgICAgICAgICBhY2NlbGVyYXRvck1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMTUzNiksXG4gICAgICAgIH0gc2F0aXNmaWVzIElBY2NlbGVyYXRvckNoaXBzLFxuICAgICAgfSxcbiAgICBdIGFzIGNvbnN0LFxuICAgIFtcbiAgICAgIE5ldXJvbnhJbnN0YW5jZVR5cGUuVFJOMlVfNDhYTEFSR0UsXG4gICAgICB7XG4gICAgICAgIGluc3RhbmNlVHlwZTogXCJ0cm4ydS40OHhsYXJnZVwiLFxuICAgICAgICB2Q3B1OiAxOTIsXG4gICAgICAgIG1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMjA0OCksXG4gICAgICAgIGFjY2VsZXJhdG9yQ2hpcHM6IHtcbiAgICAgICAgICBjaGlwczogMTYsXG4gICAgICAgICAgbmV1cm9ueENvcmVzOiA2NCxcbiAgICAgICAgICBhY2NlbGVyYXRvck1lbW9yeTogU2l6ZS5naWJpYnl0ZXMoMTUzNiksXG4gICAgICAgIH0gc2F0aXNmaWVzIElBY2NlbGVyYXRvckNoaXBzLFxuICAgICAgfSxcbiAgICBdIGFzIGNvbnN0LFxuICBdO1xuICBpdC5lYWNoKGluc3RhbmNlVHlwZXMpKFwiSW5zdGFuY2VUeXBlIG9mICVzXCIsIChpbnN0YW5jZVR5cGUsIGV4cGVjdGVkKSA9PiB7XG4gICAgZXhwZWN0KGluc3RhbmNlVHlwZS50b1N0cmluZygpKS50b0JlKGV4cGVjdGVkLmluc3RhbmNlVHlwZSk7XG4gICAgZXhwZWN0KGluc3RhbmNlVHlwZS52Q3B1KS50b0JlKGV4cGVjdGVkLnZDcHUpO1xuICAgIGV4cGVjdChpbnN0YW5jZVR5cGUubWVtb3J5KS50b1N0cmljdEVxdWFsKGV4cGVjdGVkLm1lbW9yeSk7XG4gICAgZXhwZWN0KGluc3RhbmNlVHlwZS5hY2NlbGVyYXRvckNoaXBzLmNoaXBzKS50b0JlKFxuICAgICAgZXhwZWN0ZWQuYWNjZWxlcmF0b3JDaGlwcy5jaGlwcyxcbiAgICApO1xuICAgIGV4cGVjdChpbnN0YW5jZVR5cGUuYWNjZWxlcmF0b3JDaGlwcy5uZXVyb254Q29yZXMpLnRvQmUoXG4gICAgICBleHBlY3RlZC5hY2NlbGVyYXRvckNoaXBzLm5ldXJvbnhDb3JlcyxcbiAgICApO1xuICAgIGV4cGVjdChpbnN0YW5jZVR5cGUuYWNjZWxlcmF0b3JDaGlwcy5hY2NlbGVyYXRvck1lbW9yeSkudG9TdHJpY3RFcXVhbChcbiAgICAgIGV4cGVjdGVkLmFjY2VsZXJhdG9yQ2hpcHMuYWNjZWxlcmF0b3JNZW1vcnksXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==