From 92b60a251ddb515a740e9c6d2f1811151f296c4a Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 19 Dec 2016 14:09:35 -0800 Subject: [PATCH] On start support (#324) * annotating APIs to support onstart * missed file * updated templates * adding new lines in main.ts * fixing docs * removing onstart * updated docs * updated various docs * more docs * adding upgrade policies for blocks * updated pxt reference * placing on start under "basic" --- docs/blocks.md | 2 +- docs/blocks/logic/boolean.md | 14 +- docs/blocks/logic/if.md | 14 +- docs/blocks/loops/for.md | 13 +- docs/blocks/loops/while.md | 14 +- docs/blocks/on-start.md | 22 +++ .../hack-your-headphones/music-of-light.md | 4 +- docs/projects/magic-button-trick.md | 14 +- libs/blocksprj/main.blocks | 61 +------ libs/blocksprj/main.ts | 17 +- .../_locales/bluetooth-jsdoc-strings.json | 2 +- libs/bluetoothprj/main.blocks | 61 +------ libs/bluetoothprj/main.ts | 17 +- libs/core/control.ts | 2 +- package.json | 2 +- pxtarget.json | 10 +- tests/import/microbit-blocks.hex | 159 ++++++++++++------ 17 files changed, 189 insertions(+), 239 deletions(-) create mode 100644 docs/blocks/on-start.md diff --git a/docs/blocks.md b/docs/blocks.md index d64f210c..6b53e456 100644 --- a/docs/blocks.md +++ b/docs/blocks.md @@ -11,4 +11,4 @@ Math.random(5); ## See Also -[logic](/blocks/logic), [loops](/blocks/loops), [math](/blocks/math), [variables](/blocks/variables) \ No newline at end of file +[logic](/blocks/logic), [loops](/blocks/loops), [math](/blocks/math), [variables](/blocks/variables), [on-start](/blocks/on-start) \ No newline at end of file diff --git a/docs/blocks/logic/boolean.md b/docs/blocks/logic/boolean.md index 15df1b5f..a9abbcb9 100644 --- a/docs/blocks/logic/boolean.md +++ b/docs/blocks/logic/boolean.md @@ -86,12 +86,14 @@ if (led.point(1,1) && led.point(2,2)) { When you compare two Numbers, you get a Boolean value, such as the comparison `x < 5` in the code below: ```blocks -let x = Math.random(5) -if(x < 5) { - basic.showString("low"); -} else { - basic.showString("high"); -} +input.onButtonPressed(Button.A, () => { + let x = Math.random(5) + if(x < 5) { + basic.showString("low"); + } else { + basic.showString("high"); + } +}) ``` See the documentation on [Numbers](/reference/types/number) for more information on comparing two Numbers. You can also [compare strings](/reference/types/string-functions) using the `equals` function. diff --git a/docs/blocks/logic/if.md b/docs/blocks/logic/if.md index d8755a88..186f6985 100644 --- a/docs/blocks/logic/if.md +++ b/docs/blocks/logic/if.md @@ -14,13 +14,15 @@ Click on the dark blue gear icon (see above) to add an *else* or *if* to the cur ### Example: adjusting screen brightness -```blocks -if(input.lightLevel()<100){ - led.setBrightness(255); -} -``` +If the [light level](/reference/input/light-level) is `< 100`, this code sets the brightness to `255` when the button A is pressed: -If the [light level](/reference/input/light-level) is `< 100`, this code sets the brightness to `255`: +```blocks +input.onButtonPressed(Button.A, () => { + if(input.lightLevel()<100){ + led.setBrightness(255); + } +}) +``` ### See also diff --git a/docs/blocks/loops/for.md b/docs/blocks/loops/for.md index 67fb7c00..b5ecdfd8 100644 --- a/docs/blocks/loops/for.md +++ b/docs/blocks/loops/for.md @@ -4,14 +4,21 @@ Run part of the program the number of times you say. +```block +for(let i = 0; i <= 4; ++i) { +} +``` + ### Example: Count to 4 This program will show the numbers 0, 1, 2, 3, and 4 one after another on the LED screen. ```blocks -for(let i = 0; i < 5; ++i) { -basic.showNumber(i) -} +input.onButtonPressed(Button.A, () => { + for(let i = 0; i < 5; ++i) { + basic.showNumber(i) + } +}) ``` ### See also diff --git a/docs/blocks/loops/while.md b/docs/blocks/loops/while.md index 8f2c3b10..62038e44 100644 --- a/docs/blocks/loops/while.md +++ b/docs/blocks/loops/while.md @@ -2,7 +2,7 @@ Repeat code while a [Boolean](/blocks/logic/boolean) `condition` is true. -```blocks +```block while(true) { } ``` @@ -16,11 +16,13 @@ The condition is tested before any code runs. Which means that if the condition The following example uses a while loop to make a diagonal line on the LED screen (points `0, 0`, `1, 1`, `2, 2`, `3, 3`, `4, 4`). ```blocks -let index = 4; -while(index >= 0) { - led.plot(index, index); - index--; -} +input.onButtonPressed(Button.A, () => { + let index = 4; + while(index >= 0) { + led.plot(index, index); + index--; + } +}) ``` ### See also diff --git a/docs/blocks/on-start.md b/docs/blocks/on-start.md new file mode 100644 index 00000000..723fbf88 --- /dev/null +++ b/docs/blocks/on-start.md @@ -0,0 +1,22 @@ +# On Start + +An event that runs when the program starts. + +The ``on start`` is a special event that runs when the program starts, before any other event. +Use this event to initialize your program. + +## Example + +In this example, ``on start`` sets a dimmer brightness on the screen and the button handler shows a string. + +```blocks +input.onButtonPressed(Button.A, () => { + basic.showString("Hello!") +}) +led.setBrightness(50) +``` + + +## What about JavaScript? + +``on-start`` only exists in the block editor. In JavaScript, all code executes sequentially from the first line. diff --git a/docs/projects/hack-your-headphones/music-of-light.md b/docs/projects/hack-your-headphones/music-of-light.md index e74d619e..42e966c8 100644 --- a/docs/projects/hack-your-headphones/music-of-light.md +++ b/docs/projects/hack-your-headphones/music-of-light.md @@ -10,7 +10,9 @@ Let's start by adding a variable where you can store data. Then rename the varia ```blocks -let light = input.lightLevel(); +input.onButtonPressed(Button.A, () => { + let light = input.lightLevel(); +}); ``` We want to play music on button pressed in order to register an event handler that will execute whenever when you run a script and click on button pressed on the simulator. We must start by opening the Input drawer and adding `on button pressed` A. Then add a block `rest` to plays nothing for a `1/16` beat. Modify your code so that your code looks like this. diff --git a/docs/projects/magic-button-trick.md b/docs/projects/magic-button-trick.md index 85912244..c3aecb14 100644 --- a/docs/projects/magic-button-trick.md +++ b/docs/projects/magic-button-trick.md @@ -37,7 +37,7 @@ input.onButtonPressed(Button.B, () => { We will use the @boardname@'s compass to detect the magnet. Compass's tell us what direction we are pointing by detecting the Earth's magnetic field but they can also detect any other magnet nearby. We will use that to check if our magnet is next to the @boardname@ by using the [magnetic force](/reference/input/magnetic-force) block found in the input menu's 'more' section. As we only want to measure the strength we change the drop down to select 'strength': -```blocks +```block input.magneticForce(Dimension.Strength) ``` @@ -50,16 +50,19 @@ If you have ever played with magnets you know they have two ends, often called a So in the code below we will check if the absolute value of our magnetic field strength reading is more than 100 and save the result of that check in a new variable called 'isSwitched': ```blocks -let isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100 +let force = Math.abs(input.magneticForce(Dimension.Strength)); +let isSwitched = force > 100 ``` ## Step 4: running our 'magnet nearby' check all the time At the moment our code to detect the magnet being nearby will only run once so we need to put it into a [forever](/reference/basic/forever) block so that it keeps getting run again and again checking for the magnet to come near to the @boardname@. We should also make sure 'isSwitched' is false when our program starts. ```blocks +let force = 0; let isSwitched = false; basic.forever(() => { - let isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100 + force = Math.abs(input.magneticForce(Dimension.Strength)); + isSwitched = force > 100 }) ``` @@ -68,10 +71,11 @@ basic.forever(() => { Now we can check the value of our variable 'isSwitched' whenever we want and we will know that the magnet is nearby if it's value is 'true'. Let's use that to change how the buttons work and complete the code for our trick. We will add an 'if, else' block to each button's code and check if we should swap over what each button displays because 'isSwitched' is equal to true: ```blocks - +let force = 0; let isSwitched = false; basic.forever(() => { - isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100 + force = Math.abs(input.magneticForce(Dimension.Strength)); + isSwitched = force > 100 }) input.onButtonPressed(Button.A, () => { diff --git a/libs/blocksprj/main.blocks b/libs/blocksprj/main.blocks index d809e7e4..5773d9b9 100644 --- a/libs/blocksprj/main.blocks +++ b/libs/blocksprj/main.blocks @@ -1,62 +1,3 @@ - - - -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -TRUE -FALSE -TRUE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -TRUE -FALSE -FALSE -FALSE -TRUE -FALSE -TRUE -TRUE -TRUE -FALSE - - -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE - - - - - + \ No newline at end of file diff --git a/libs/blocksprj/main.ts b/libs/blocksprj/main.ts index 4dfdb3a1..8b137891 100644 --- a/libs/blocksprj/main.ts +++ b/libs/blocksprj/main.ts @@ -1,16 +1 @@ -basic.forever(() => { - basic.showLeds(` - . # . # . - # . # . # - # . . . # - . # . # . - . . # . . - `) - basic.showLeds(` - . . . . . - . . . . . - . . . . . - . . . . . - . . . . . - `) -}) \ No newline at end of file + diff --git a/libs/bluetooth/_locales/bluetooth-jsdoc-strings.json b/libs/bluetooth/_locales/bluetooth-jsdoc-strings.json index 2ec425db..ea5514a8 100644 --- a/libs/bluetooth/_locales/bluetooth-jsdoc-strings.json +++ b/libs/bluetooth/_locales/bluetooth-jsdoc-strings.json @@ -1,5 +1,5 @@ { - "bluetooth": "Support for additional Bluetooth services.", + "bluetooth": "Support for additional Bluetooth services.\n\nSupport for additional Bluetooth services.", "bluetooth.advertiseUrl": "Advertise an Eddystone URL", "bluetooth.advertiseUrl|param|connectable": "true to keep bluetooth connectable for other services, false otherwise.", "bluetooth.advertiseUrl|param|power": "power level between 0 and 7, eg: 7", diff --git a/libs/bluetoothprj/main.blocks b/libs/bluetoothprj/main.blocks index d809e7e4..5773d9b9 100644 --- a/libs/bluetoothprj/main.blocks +++ b/libs/bluetoothprj/main.blocks @@ -1,62 +1,3 @@ - - - -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -TRUE -FALSE -TRUE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -TRUE -FALSE -FALSE -FALSE -TRUE -FALSE -TRUE -TRUE -TRUE -FALSE - - -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE -FALSE - - - - - + \ No newline at end of file diff --git a/libs/bluetoothprj/main.ts b/libs/bluetoothprj/main.ts index 4dfdb3a1..8b137891 100644 --- a/libs/bluetoothprj/main.ts +++ b/libs/bluetoothprj/main.ts @@ -1,16 +1 @@ -basic.forever(() => { - basic.showLeds(` - . # . # . - # . # . # - # . . . # - . # . # . - . . # . . - `) - basic.showLeds(` - . . . . . - . . . . . - . . . . . - . . . . . - . . . . . - `) -}) \ No newline at end of file + diff --git a/libs/core/control.ts b/libs/core/control.ts index d9cd8f75..a1479a59 100644 --- a/libs/core/control.ts +++ b/libs/core/control.ts @@ -31,7 +31,7 @@ namespace control { /** * If the condition is false, display msg on serial console, and panic with code 098. */ - export function assert(condition: boolean, msg ?: string) { + export function assert(condition: boolean, msg?: string) { if (!condition) { console.log("ASSERTION FAILED") if (msg != null) { diff --git a/package.json b/package.json index 76275830..522b015f 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,6 @@ "semantic-ui-less": "^2.2.4" }, "dependencies": { - "pxt-core": "0.6.7" + "pxt-core": "0.7.1" } } diff --git a/pxtarget.json b/pxtarget.json index fcdc94e5..27fe9d0d 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -57,6 +57,12 @@ "bluetooth\\s*\\.uartRead\\s*\\((.*?)\\)": "bluetooth.uartReadUntil($1)", "bluetooth\\s*\\.uartWrite\\s*\\((.*?)\\)": "bluetooth.uartWriteUntil($1)" } + }, + { + "type": "blockId", + "map": { + "device_get_acceleration": "device_acceleration" + } } ] }, @@ -64,7 +70,9 @@ "mathBlocks": true, "loopsBlocks": true, "logicBlocks": true, - "variablesBlocks": true + "variablesBlocks": true, + "onStartColor": "#0078D7", + "onStartNamespace": "basic" }, "simulator": { "autoRun": true, diff --git a/tests/import/microbit-blocks.hex b/tests/import/microbit-blocks.hex index 3e2802bf..721edc35 100644 --- a/tests/import/microbit-blocks.hex +++ b/tests/import/microbit-blocks.hex @@ -11908,62 +11908,111 @@ :10071000F19501004198010039B1010099B901003A :10072000D5C901009D26020061270200C180010099 :10073000708E3B92C615A841C49866C975EE519754 -:100740002D0CF6CB4FCF31AA3852319F38B256E537 +:100740002D0CF6CB4FCF31AA187FF87FFC58A9E9C2 :100750000000000000000000000000000000000099 -:1007600000B5002001B4002001B4002001B4002035 -:1007700000028C30024602BC01BCE8F745FC01B423 -:10078000E8F7CAFC01BCF9F731FA0098F9F72EFA3C -:1007900001B000BD00B5002001B4069801B4069870 -:1007A000014601BCF8F759FE01B4039801B405985D -:1007B000014601BCF8F751FE014601BCF8F753FEB3 -:1007C00001B4059801B40798014601BCF8F745FE4D -:1007D000014601BCF8F743FE01B40498014601BC90 -:1007E000F8F739FE0090FFE7009801B000BD00B5B2 -:1007F000002001B4002000900298002802D0FF20C1 -:100800000090FFE7059801B4F9F7C9F9059801B41C -:10081000059801B40398034604BC02BC0098F9F79C -:100820000AF901BCF9F7E2F90598F9F7DFF901B027 -:1008300000BD00B5002001B40020E8F77DFB00906A -:10084000FFE7009801B000BDFFFF000020B50D4696 -:1008500000200002A83001B40120000290300146BF -:1008600001BCE8F70FFA00200002B83001B4012003 -:1008700000029030014601BCE8F704FA20BD0000F8 -:10088000FFFF05000500000000000000010001005E -:100890000000000000000000000000010101002A2B -:1008A000FFFF050005000000000000000000000040 -:1008B0000000000000000000000000000000002A0E -:1008C00041140E2FB82FA2BB4C00A3010000000062 -:1008D0007B22636F6D7072657373696F6E223A224B -:1008E0004C5A4D41222C2268656164657253697AC5 -:1008F00065223A3133392C227465787453697A65EC -:10090000223A323439342C226E616D65223A2262E9 -:100910006C6F636B73626C696E6B227D5D0000802F -:1009200000490A000000000000003D888867041CA0 -:10093000BCC1C8A25578869B4D69261C354501422D -:100940001948E37B0692B2DBE3A99A218E18EFA542 -:100950006421FF3A50DF5CB84D25B831BC1D9BD0F7 -:10096000A3720BD23F36166C9FFADA84711D2EB338 -:100970003291D1DEB646B0BE0FFADE6FD7AD7C1134 -:10098000573353851403078AD6AEE9A5C8D021B2E0 -:100990007FFAB45E1D9AF8C10C1AEF12B167A5C2B6 -:1009A000329D2DC02570F67BAF4E1FC2923CE042B7 -:1009B00028E478417276160D1F06CE6E0CCBD84C0B -:1009C000B456FF79CC0DE99E98FE0D65BED6F7842E -:1009D000890D2B69552360DED35DCD22F579D8E4EE -:1009E000F214F5717F1C2CEF0D59E583D995AC807D -:1009F0000624B660B3E376A4C5A4C62BC0B1766066 -:100A00005B5E6DBBD94336CEF28C58753EF5E6176A -:100A10000D454E5EA91A60E7F9BAA6413CFDB93210 -:100A2000CC8DC16D25BCBA7ECF28A19D88036FAD4A -:100A30008EF21F6085E68BBD74D011870E15C5320E -:100A4000CAB0F268C6FF6A8E3DB568FF545C98A5CF -:100A5000041DFD9090BB3978F3995097661EE126EE -:100A60000993D095AB665AE4626AC471DC13A6D4CC -:100A700012F078262A98D778E53BE920E252773DB4 -:100A8000206C0C9FA0E8589826BD5F95814AC5BE92 -:100A90007BC997717460085C806C1CD9B85CCD33DD -:100AA0000016DD6FD865555605505938E15B941135 -:100AB000D2FAC2F686783310D2E2FF86A151000046 +:1007600000B5002001B401B401B401B401B401200A +:1007700001B4002001B4002001B400200002F630D2 +:10078000024602BC01BCE8F73FFC014601BC02B4D2 +:10079000F9F7B0FC01BCF9F729FA022001B40020F6 +:1007A00001B4002001B4012000021A30024602BC4C +:1007B00001BCE8F729FC014601BC02B4F9F79AFC38 +:1007C00001BCF9F713FA002001B4002001B40120A4 +:1007D00000024030024602BC01BCE8F715FC01B43F +:1007E000E8F79AFC01BCF9F701FA02209621E7F735 +:1007F00021FF01200002483001B4012000029030A6 +:10080000014601BCE8F73EFA012000025830E8F743 +:10081000CDF801B4962001460098F9F72FF901BCF4 +:10082000F9F7E4F90120E7F73FFEE7F785FDE8F780 +:1008300065FAE7F7AFFE0020E7F71CFEE7F784FD57 +:100840000020E7F7F9FD0020E7F714FE0020E7F7A6 +:1008500083FD0098F9F7CAF90298F9F7C7F90498E7 +:10086000F9F7C4F905B000BD00B5002001B4069841 +:1008700001B40698014601BCF8F7EFFD01B40398F6 +:1008800001B40598014601BCF8F7E7FD014601BC3B +:10089000F8F7E9FD01B4059801B40798014601BCD9 +:1008A000F8F7DBFD014601BCF8F7D9FD01B4049867 +:1008B000014601BCF8F7CFFD0090FFE7009801B0BA +:1008C00000BD00B5002001B400200090029800286F +:1008D00002D0FF200090FFE7059801B4F9F75FF917 +:1008E000059801B4059801B40398034604BC02BC02 +:1008F0000098F9F7A0F801BCF9F778F90598F9F72D +:1009000075F901B000BD00B5002001B40020E8F782 +:1009100013FB0090FFE7009801B000BDFFFF00004F +:1009200020B50D46002001B401B404200190002040 +:100930000090009801B40298014601BCF8F767FDE9 +:10094000002805D000980121F8F785FD0090F0E718 +:1009500000200021F8F75BFD002800D0FFE702B07F +:1009600020BD0000FFFF000020B50D46002001B4AF +:1009700001B40120002819D004200121F8F76BFDF3 +:10098000019000200090009801B40298014601BC3B +:10099000F8F73DFD002805D000980121F8F75BFD30 +:1009A0000090F0E71420E7F79BFDE2E702B020BDDE +:1009B000FFFF000020B50D466420E7F791FD20BD44 +:1009C000FFFF05000500000000000000010001001D +:1009D0000000000000010000000100010101002AE8 +:1009E000FFFF060048656C6C6F21000000000000EE +:1009F00041140E2FB82FA2BB55006F03000000005A +:100A00007B22636F6D7072657373696F6E223A2219 +:100A10004C5A4D41222C2268656164657253697A93 +:100A200065223A3133352C227465787453697A65BE +:100A3000223A343236362C226E616D65223A2261BA +:100A400077652D696E73706972696E672073637262 +:100A5000697074227D5D000080003111000000008B +:100A60000000003D888867041CBCC1C8A255788678 +:100A70009B4D69261C354501421948E37B0692B21D +:100A8000DBE3A99A218E18EFA56421FF3A50DF5CC1 +:100A9000B84D25B831BC1D9BD0A3720BD23F361682 +:100AA0006C9FFADA84711D2EC9AC893737C3C8E24E +:100AB0003144571FA844D7A3963E762405463739BC +:100AC000562C2741749E7ADF8947F2C0F16D27E6E4 +:100AD000671D21D7B68962CD4A32EB0C6D831DCEDE +:100AE000D938679D3E575063D676C5D1AD67714AF8 +:100AF000DF5E908FB74BF1BA71BE31AF0D068F211B +:100B000042E1428B1A26AEB037DFB75E85844F6F65 +:100B10007EFD07E78A8E10F0509394D2D3D10F89CF +:100B200079E24994B05EC5B4191F8F8732BA2EADF1 +:100B3000BDA33AEA6B799E8F238650EED8A213129A +:100B40004CE8DBDF1CBC54075FAB965AB71F196437 +:100B500057356BE317D9558961C31B5E7A253D8BE9 +:100B6000101FCAEA6E9334AFDEB378209D13B0B283 +:100B7000BBD03BC203BE98A78036163F9B529787D7 +:100B800047E2EBB8DB41A6C2DE8D0437572CBDC867 +:100B900070C5D57E332A3633384DAC966B5EE0F89F +:100BA0001A4FFBEE3BD5FE46C1FF358742209871B8 +:100BB000585520F96EAAEF9324E9B1252895D54719 +:100BC0006CFC464A13EB3A3899E7D46BA3C2027B1C +:100BD0008A502E8AA3F91A7AFD6DD225F44D72102F +:100BE00013FB3F888E41786D06AA9C6CBC12DB4DCE +:100BF000FCEAB9619A1C30A75D2426231876ED041F +:100C0000E1F6A1976F1202A06C6DA23FB9ED17B982 +:100C10004661EAE80727E90B820F1648E858286B77 +:100C2000C4312974DA972D1A5681A72E31DA22FFA2 +:100C3000C68CE7BBCBACAA9EBD6FF5C91D62E4B9FB +:100C40009C1B6E664633ECFCC88C169A8DF048539C +:100C50009687FAB48B5DD1A1CC7568CBA05DBDC27F +:100C6000E485A7A1BA020C34F54A5876D5793EF24C +:100C7000240921FA568D22B801545A7140A289D50F +:100C8000C96E7F553E45B8911C762CA743E18DDF98 +:100C90007FDB0D260FF7DC95B1454CB8B4A06BEEA9 +:100CA000BBAB7A21557231ADDA411E05EDAD8E7ABE +:100CB000FCE220D686E36BD35922FC6BDA31BDD43B +:100CC000FF06648ED8A908BADFF63CE91A3B5874CF +:100CD00070836F6C9461A68A19299865D6BA06B894 +:100CE00063C874A840820066F1BD40FC0816A4F8F1 +:100CF000B8505B1E18047413CFA130569896E37950 +:100D0000941201C53A972167887F1258FB9D85B3DD +:100D1000D1111EFAFB63E87B849CE3166143E8F281 +:100D2000B3EA7C8B03B40E241F13F43DD24309ECC9 +:100D30000B7F066F94CC1DFC0606F9B2284BA2BDB2 +:100D4000BBBA5A03F54A5646DB56956B1D5CEC9FC1 +:100D50005112F313C27CED0D7921A38A36C35D01D4 +:100D6000485A30A244E32C82C52EEB6C9F260F51CB +:100D700076E9E1C367F794A852FDAC99CA3B1364C6 +:100D80006F4F839EA694170E8339279977896845FC +:100D900011BD5F9646D7966E61E47FCF282FBD4C7C +:100DA0001709BFF597D59E441D6CDB5B74C44A1DC3 +:100DB000C29F9A9190DFE13600061A2252F094FF0A +:100DC000BEF48D7000000000000000000000000074 :10C00000903C002061DC030073DC030075DC03005E :10C010000000000000000000000000000000000020 :10C0200000000000000000000000000069C10300E3