Skip to content

Commit

Permalink
feat: Include option for outputting arc56 json files
Browse files Browse the repository at this point in the history
  • Loading branch information
tristanmenzel committed Nov 27, 2024
1 parent 7df6574 commit dfad42c
Show file tree
Hide file tree
Showing 16 changed files with 1,862 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const cliOptionsSchema = z.object({
// Puya options
outputTeal: z.boolean(),
outputArc32: z.boolean(),
outputArc56: z.boolean(),
outputSsaIr: z.boolean(),
outputOptimizationIr: z.boolean(),
outputDestructuredIr: z.boolean(),
Expand Down Expand Up @@ -61,6 +62,11 @@ function cli() {
'Do not output {contract}.arc32.json ARC-32 app spec file. Only applicable to ARC4 contracts',
).default(defaultPuyaOptions.outputArc32),
)
.addOption(
new Option('--output-arc56', 'Output {contract}.arc56.json ARC-56 app spec file. Only applicable to ARC4 contracts').default(
defaultPuyaOptions.outputArc56,
),
)
.addOption(new Option('--output-ssa-ir', 'Output IR (in SSA form) before optimisations').default(defaultPuyaOptions.outputSsaIr))
.addOption(new Option('--output-optimization-ir', 'Output IR after each optimization').default(defaultPuyaOptions.outputOptimizationIr))
.addOption(
Expand Down
3 changes: 3 additions & 0 deletions src/puya/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export type CompilationSetMapping = Record<string, string>
export const defaultPuyaOptions: PuyaPassThroughOptions = {
outputTeal: true,
outputArc32: true,
outputArc56: true,
outputSsaIr: false,
outputOptimizationIr: false,
outputDestructuredIr: false,
Expand All @@ -26,6 +27,7 @@ export type PuyaPassThroughOptions = Omit<PuyaOptions, 'compilationSet'>
export class PuyaOptions {
outputTeal: boolean
outputArc32: boolean
outputArc56: boolean
outputSsaIr: boolean
outputOptimizationIr: boolean
outputDestructuredIr: boolean
Expand All @@ -50,6 +52,7 @@ export class PuyaOptions {
this.compilationSet = compilationSet
this.outputTeal = passThroughOptions.outputTeal
this.outputArc32 = passThroughOptions.outputArc32
this.outputArc56 = passThroughOptions.outputArc56
this.outputSsaIr = passThroughOptions.outputSsaIr
this.outputOptimizationIr = passThroughOptions.outputOptimizationIr
this.outputDestructuredIr = passThroughOptions.outputDestructuredIr
Expand Down
1 change: 1 addition & 0 deletions tests/approvals.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ describe('Approvals', () => {
optimizationLevel: 0,
outputTeal: true,
outputArc32: true,
outputArc56: true,
},
)
invariant(result.ast, 'Compilation must result in ast')
Expand Down
190 changes: 190 additions & 0 deletions tests/approvals/out/abi-decorators/AbiDecorators.arc56.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
{
"name": "AbiDecorators",
"structs": {},
"methods": [
{
"name": "justNoop",
"args": [],
"returns": {
"type": "void"
},
"actions": {
"create": [],
"call": [
"NoOp"
]
},
"readonly": false,
"events": [],
"recommendations": {}
},
{
"name": "createMethod",
"args": [],
"returns": {
"type": "void"
},
"actions": {
"create": [
"NoOp"
],
"call": []
},
"readonly": false,
"events": [],
"recommendations": {}
},
{
"name": "allActions",
"args": [],
"returns": {
"type": "void"
},
"actions": {
"create": [],
"call": [
"NoOp",
"OptIn",
"CloseOut",
"DeleteApplication",
"UpdateApplication"
]
},
"readonly": false,
"events": [],
"recommendations": {}
},
{
"name": "overrideReadonlyName",
"args": [],
"returns": {
"type": "uint64"
},
"actions": {
"create": [],
"call": [
"NoOp"
]
},
"readonly": true,
"events": [],
"recommendations": {}
},
{
"name": "methodWithDefaults",
"args": [
{
"type": "uint64",
"name": "a",
"defaultValue": {
"source": "global",
"data": "Z2xvYmFsVmFsdWU=",
"type": "AVMString"
}
},
{
"type": "uint64",
"name": "b",
"defaultValue": {
"source": "method",
"data": "readonly()uint64"
}
},
{
"type": "uint64",
"name": "c"
}
],
"returns": {
"type": "uint64"
},
"actions": {
"create": [],
"call": [
"NoOp"
]
},
"readonly": false,
"events": [],
"recommendations": {}
}
],
"arcs": [
22,
28
],
"networks": {},
"state": {
"schema": {
"global": {
"ints": 1,
"bytes": 0
},
"local": {
"ints": 0,
"bytes": 0
}
},
"keys": {
"global": {
"globalValue": {
"keyType": "AVMString",
"valueType": "AVMUint64",
"key": "Z2xvYmFsVmFsdWU="
}
},
"local": {},
"box": {}
},
"maps": {
"global": {},
"local": {},
"box": {}
}
},
"bareActions": {
"create": [],
"call": []
},
"sourceInfo": {
"approval": {
"sourceInfo": [
{
"pc": [
108,
123,
148,
168
],
"errorMessage": "OnCompletion is not NoOp"
},
{
"pc": [
128
],
"errorMessage": "can only call when creating"
},
{
"pc": [
113,
138,
153,
173
],
"errorMessage": "can only call when not creating"
}
],
"pcOffsetMethod": "none"
},
"clear": {
"sourceInfo": [],
"pcOffsetMethod": "none"
}
},
"source": {
"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czo6QWJpRGVjb3JhdG9ycy5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgY29uc3RydWN0b3IKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6OkFiaURlY29yYXRvcnMuY29uc3RydWN0b3IoKSAtPiB2b2lkOgpjb25zdHJ1Y3RvcjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBkZWZhdWx0IGNsYXNzIEFiaURlY29yYXRvcnMgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwcm90byAwIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjE2CiAgICAvLyBnbG9iYWxWYWx1ZSA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMTIzKSB9KQogICAgcHVzaGJ5dGVzICJnbG9iYWxWYWx1ZSIKICAgIHB1c2hpbnQgMTIzIC8vIDEyMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjpBYmlEZWNvcmF0b3JzLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBkZWZhdWx0IGNsYXNzIEFiaURlY29yYXRvcnMgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHhmOTAyMGQ1YSAvLyBtZXRob2QgImp1c3ROb29wKCl2b2lkIgogICAgcHVzaGJ5dGVzIDB4ZTE3OWY5ZDQgLy8gbWV0aG9kICJjcmVhdGVNZXRob2QoKXZvaWQiCiAgICBwdXNoYnl0ZXMgMHg2M2MyN2FiYSAvLyBtZXRob2QgImFsbEFjdGlvbnMoKXZvaWQiCiAgICBwdXNoYnl0ZXMgMHgxNGQxYjZlYSAvLyBtZXRob2QgIm92ZXJyaWRlUmVhZG9ubHlOYW1lKCl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHhjMTM2NzM3NCAvLyBtZXRob2QgIm1ldGhvZFdpdGhEZWZhdWx0cyh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB1bmNvdmVyIDUKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2p1c3ROb29wX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlTWV0aG9kX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fYWxsQWN0aW9uc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX292ZXJyaWRlUmVhZG9ubHlOYW1lX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kV2l0aERlZmF1bHRzX3JvdXRlQDYKICAgIGIgX19wdXlhX2FyYzRfcm91dGVyX19fc3dpdGNoX2Nhc2VfZGVmYXVsdEA3CgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19qdXN0Tm9vcF9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6NQogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ05vT3AnIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGp1c3ROb29wCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVNZXRob2Rfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjcKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgPT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlTWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbGxBY3Rpb25zX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czo5CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ05vT3AnLCAnT3B0SW4nLCAnQ2xvc2VPdXQnLCAnRGVsZXRlQXBwbGljYXRpb24nLCAnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYWxsQWN0aW9ucwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3ZlcnJpZGVSZWFkb25seU5hbWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjExCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUsIG5hbWU6ICdvdmVycmlkZVJlYWRvbmx5TmFtZScgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgcmVhZG9ubHkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZFdpdGhEZWZhdWx0c19yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6MTgKICAgIC8vIEBhYmltZXRob2QoeyBkZWZhdWx0QXJndW1lbnRzOiB7IGE6IHsgZnJvbTogJ2dsb2JhbFZhbHVlJyB9LCBiOiB7IGZyb206ICdyZWFkb25seScgfSwgYzogeyBjb25zdGFudDogMTQ1IH0gfSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWJpRGVjb3JhdG9ycyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjE4CiAgICAvLyBAYWJpbWV0aG9kKHsgZGVmYXVsdEFyZ3VtZW50czogeyBhOiB7IGZyb206ICdnbG9iYWxWYWx1ZScgfSwgYjogeyBmcm9tOiAncmVhZG9ubHknIH0sIGM6IHsgY29uc3RhbnQ6IDE0NSB9IH0gfSkKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgbWV0aG9kV2l0aERlZmF1bHRzCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zd2l0Y2hfY2FzZV9kZWZhdWx0QDc6CiAgICBiIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A5OgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBkZWZhdWx0IGNsYXNzIEFiaURlY29yYXRvcnMgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6OkFiaURlY29yYXRvcnMuanVzdE5vb3AoKSAtPiB2b2lkOgpqdXN0Tm9vcDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9hYmktZGVjb3JhdG9ycy5hbGdvLnRzOjUtNgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ05vT3AnIH0pCiAgICAvLyBwdWJsaWMganVzdE5vb3AoKTogdm9pZCB7fQogICAgcHJvdG8gMCAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czo6QWJpRGVjb3JhdG9ycy5jcmVhdGVNZXRob2QoKSAtPiB2b2lkOgpjcmVhdGVNZXRob2Q6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czo3LTgKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICAvLyBwdWJsaWMgY3JlYXRlTWV0aG9kKCk6IHZvaWQge30KICAgIHByb3RvIDAgMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6OkFiaURlY29yYXRvcnMuYWxsQWN0aW9ucygpIC0+IHZvaWQ6CmFsbEFjdGlvbnM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czo5LTEwCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ05vT3AnLCAnT3B0SW4nLCAnQ2xvc2VPdXQnLCAnRGVsZXRlQXBwbGljYXRpb24nLCAnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgLy8gcHVibGljIGFsbEFjdGlvbnMoKTogdm9pZCB7fQogICAgcHJvdG8gMCAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czo6QWJpRGVjb3JhdG9ycy5yZWFkb25seSgpIC0+IHVpbnQ2NDoKcmVhZG9ubHk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czoxMS0xMgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBuYW1lOiAnb3ZlcnJpZGVSZWFkb25seU5hbWUnIH0pCiAgICAvLyBwdWJsaWMgcmVhZG9ubHkoKTogdWludDY0IHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6MTMKICAgIC8vIHJldHVybiA1CiAgICBwdXNoaW50IDUgLy8gNQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6OkFiaURlY29yYXRvcnMubWV0aG9kV2l0aERlZmF1bHRzKGE6IHVpbnQ2NCwgYjogdWludDY0LCBjOiB1aW50NjQpIC0+IHVpbnQ2NDoKbWV0aG9kV2l0aERlZmF1bHRzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6MTgtMTkKICAgIC8vIEBhYmltZXRob2QoeyBkZWZhdWx0QXJndW1lbnRzOiB7IGE6IHsgZnJvbTogJ2dsb2JhbFZhbHVlJyB9LCBiOiB7IGZyb206ICdyZWFkb25seScgfSwgYzogeyBjb25zdGFudDogMTQ1IH0gfSB9KQogICAgLy8gcHVibGljIG1ldGhvZFdpdGhEZWZhdWx0cyhhOiB1aW50NjQsIGI6IHVpbnQ2NCwgYzogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2FiaS1kZWNvcmF0b3JzLmFsZ28udHM6MjAKICAgIC8vIHJldHVybiBhICogYiArIGMKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcHByb3ZhbHMvYWJpLWRlY29yYXRvcnMuYWxnby50czo6QWJpRGVjb3JhdG9ycy5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"events": [],
"templateVariables": {}
}
Loading

0 comments on commit dfad42c

Please sign in to comment.