text:
# 100 D.I.Y. Recursive Martians - Aliens Vol. 2

The idea ...

let's do the world's 1st (d.i.y) recursive generative ...
that let's you mix'n'match inscribes from more than one collection source (yes, that is recursive!) ...

## Wen mint?

To find your g(enerative) numbers in range 0-49 (50) - try the [D.I.Y. Recursive Martians - Aliens Vol. 2 Previewer »](https://ordbase.github.io/generative-orc-721/diymartians)

Or see the cheatsheet for names & categories here -> [diymartians/meta.csv](meta.csv).

For the mint inscribe text - use

``` json
{
   "p":"orc-721",
   "op":"mint",
   "s":"diymartians",
   "g":[]
}
```

Fill-in your g(enenrative) numbers and ALWAYS validate the json format - e.g. here -> <https://jsonlint.com>

ALWAYS preview your image for best results - YOUR NUMBERS, YOUR IMAGE.

.. IMPORTANT TIP  .... if you want a background START with background - no other way possible.

... again if you use a background  MUST be first ...  you can use NO background (than transparent).

... one more tip ..... number 8  .. is the happy alien smile!

.. tip ... if you use the hoodie (clothing)  add before laser eyes or shades or noun glasses etc.

... alpha tip ...
... only one (ultra-ultra-ultra-rare) hair attribute in the set ...
... black mohawk  - no. 7

... hard to see the (golden) jewelery ... no. 34 is the (golden) earing ...
.. no. 35 is the golden chain ...

Questions? Comments?

Please post in the #generative-orc-721 channel
in the ordinal punks discord.
For an invite
see <https://twitter.com/OrdinalPunks/status/1620230583711576068>.

## Wen deploy?

Yes, you can help ...  the deploy insribe text ...

```json
{
  "p": "orc-721",
  "op": "deploy",
  "slug": "diymartians",
  "name": "D.I.Y. Recursive Martians - Aliens Vol. 2",
  "max": 100,
  "dim": "24x24",
  "generative": [
  "0829dc471f8bb92a971dfdfb00a71c016b833c8f1d5f39dcb15aa5535d08fc15i0",
  "9482552ec759b76577b28923741eb4bfc7770cead528755bf8fa44196ae9318ci0",
  "5b8eb4a05f13fffc49f824f457fb080b67e4fdc312fbbf2f804cef59e6d5fad2i0",
  "85e0efd6cc2801ab7e1fe28e23110441348ca40481599f880c571ff4f69f066fi0",
  "7953ccb6614a41e7b4c4ed2a2b112b52feda387de92de2c1a314f03d5da41955i0",
  "2f1219924cfa01f9816581e8a39e201f15e19ab447e852ff9b43b13fa7b0c75di0",
  "e60f597ec41c50e823ea382c101dfc2f30c13a927222be3b73cedd88bd1b9237i0",
  "5ce9f89ad571e5380baa5b5ee387f08ea313421e7e54662b3899d411c39321ddi0",
  "3459b14a4fcb7bce1df0465abc711b556caba6f7b42d4f925f1ddf830be47125i0",
  "1355524a2aab576e069bac91227b0e52d227d65d84c5535377d3a0ea4e44d470i0",
  "a6b4b81f69e8c217db24f0a71954195d67ced49a819b67a4daf9f3ca7fa1b971i0",
  "83827ec13cb55a35fe3adca5acf67caf943c3bd6810f8fa893b067e8015c8f19i0",
  "5b1e638c050318bec23f17b8b7758ccf13945e422516da6c722c67ae5ed4e26di0",
  "5dcf96b13e5762d5a288d8bee36deb933fe192a55475199fe9a39ae29dd16853i0",
  "5760ce05009e94a750a7245cac994fa9ffd388eadc757929ac17737811455429i0",
  "0bd902941392ea138adb7db30cecdf5bc09a92c80e3e1bc3ecdf3c2d0abf6631i0",
  "7c2fd41b52624ddb1ba11fe1c6d95475f2e42c4b53d6aaf6a16a09064acebe38i0",
  "0f473c9dcd14e3f43a6599b038d810eac16bc6394edcfcf6b32f8df992ab6791i0",
  "d32c50c23693a028e2381d6f756746a9ff684f2028edf694ab7b1b6cde78e2cdi0",
  "d61fc2a89ecc6ae65cf91cdfac9edc37fd60c38621dac211f3a70891ef79b69ai0",
  "680e2ee8cad86aa174b4f3373d733370c9a6fc4230b9708d520a0f6bcb8e72a6i0",
  "56d3f4f661b2b4a9fc17755171d7cf4da74e570614b6b45de0cc87a809c3eb3ci0",
  "fe4321178bd841e52fdeb72ce4456c5b7596c0d611b19da15ba75ec63b5314cai0",
  "eddc1242f0fd290e130332e046897ad41dce1e7e112df48ecf2168e43172d383i0",
  "a2110fb4afaa29bc70bcfac445f750ecb5e81777e8d080be2d2b07eb030ba0ffi0",
  "c1277df4b986067b2a3f006d717b7f6d042896840c8b592e5a8b9ff22444b08fi0",
  "722dfdc90a67ff7eb892d13393a8a5b360b8a109f3d809600919684a600ff60ei0",
  "a0d11e78978a9dd5f1d891b71f06bd2d411c08372eba1f23e8b0722474388130i0",
  "2c2d812754b9374ffb699173da7f6d476af138a99906b66b8453cc4343305167i0",
  "964c52312f1db9025695b181d5f631292d29bec63ff9587138a589cb5ff8c26di0",
  "545fd4d45d2f6d732d48accc082f72b67a00d19f88517320f814bf1fe827c816i0",
  "72fe7ebda802852f499dca865ec22ac43eacfcf4796d761969ae8358791e943ci0",
  "4db2e931b5cd489d8007d111d20ab97d84161b84c8f7ff3038e1afe79567b9afi0",
  "4869c9bb7cf23e68ad94da5b1e9de1feff1ebdcaf9a08fccca5f1887dd40e239i0",
  "06136a5b4fb585069ef6265a0fde3baf67ee914b9f784d2c951f3a8187800d54i0",
  "8043604c7c96a5a43a97e251b246102ca40c0203431ff21bd26f23330dfa554ci0",
  "92e7f48454546718f98103d7464d954033adbee21855f06584be06faa3e291ddi0",
  "a01012b213ed425c5d4038bc36016f19f4f342ca052ff9bf6971672164e1a402i0",
  "87d89d290ebde5d5b7aa75b4c8d0359515e25ea1542bc0646dc3f5b0b2fc55fdi0",
  "aab67a4269ca0bda649fe341bd88c862aba2e9bf6e0826b9dfa5c4ba8fe62c2di0",
  "189b02ffc8aac68a45102e9837a1ca92e422bf5544d9011a863626cf6b0abeeai0",
  "43e93e43f2dac75b141baaa5b08df440e0b6ec5755577a9554a7af6540447bb7i0",
  "39d774f7d7514371c88bc4f939346f6b23000c9892ac4ae8ea36c76694e3b842i0",
  "b268b2acccd6b04680c2aa3130863ffbaa450f6870f100af678428cd07212ef6i0",
  "ac810c9098681e100964166b7510d1ac371c147861b0ae2a862da3a8b8256037i0",
  "4b9f880df07b072a4147a62acdd0881d024d14da6d84174db9b5ac555b71b346i0",
  "014ad6ed6297bc4ed624b2856e036c6bde115d51eb7200b14e3b3413ad53db08i0",
  "e139b5b0649186772cbf044bb8d3c5e43b77e3cf0472008ce2aaf52966c921eci0",
  "6eb271ad3fdd15cc2ec34dda462e71aaa8a7ef7e306cfd189931ef37216a9c60i0",
  "47cb34f1d73371df0b27ca0a259927fa80e2b2d9ee0e1d487fca5c9029b67b49i0"
]}
```

### Step 1:  24×24px .PNG Inscribes - New Aliens, Laser Eyes & Backgrounds To "Recurse"

Help with the 24×24px .PNG inscribes ...      IMPORTANT! PLEASE ONLY INSCRIBE 24x24px .PNGs in 1x .. NO 4x -  the 4x is only for documentation in the readme page.

#### 7 Martians in 24×24px in .PNG   - DONE!

orange -> ![](i/orange.png)  <- (204 bytes)   [inscribe №12225771](https://www.ord.io/12225771)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

gold       ->   ![](i/gold.png)  <-  (204 bytes)  [inscribe №12225872](https://www.ord.io/12225872)  by [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

cyber green  ->  ![](i/cybergreen.png)  <-  (207 bytes)  [inscribe №12225773](https://www.ord.io/12225773) by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

deep blue   ->   ![](i/deepblue.png)  <- (207 bytes)    [inscribe №12225772](https://www.ord.io/12225772) by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

midnight   ->    ![](i/midnight.png)  <- (204 bytes)  [inscribe №12225841](https://www.ord.io/12225841) by [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

magenta    ->    ![](i/magenta.png)  <- (204 bytes)   [inscribe №12225843](https://www.ord.io/12225843)    by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

mars red -> ![](i/marsred.png)  <- (204 bytes)   [inscribe №12225816](https://www.ord.io/12225816) by [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

in 4x  (only for documentation - DO NOT INSCRIBE)

![](i/martians@4x.png)

#### 3 Laser Eyes in 24×24px in .PNG   - DONE!

laser eyes -> ![](i/lasereyes.png)  <- (143 bytes)  [inscribe №12359718](https://www.ord.io/12359718)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

laser eyes (gold) ->  ![](i/lasereyes-gold.png)  <- (143 bytes)  [inscribe №12359739](https://www.ord.io/12359739)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

laser eyes (blue) ->  ![](i/lasereyes-blue.png)  <- (208 bytes)  [inscribe №12359716](https://www.ord.io/12359716) by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

in 4x  (only for documentation - DO NOT INSCRIBE)

![](i/lasereyes@4x.png)

and a sampling of Martians w/ Laser Eyes in 4x  (only for documentation - DO NOT INSCRIBE)

![](i/martians-lasereyes@4x.png)

#### 10 Backgrounds in 24×24px in .PNG  - DONE!

bitcoin orange -> ![](i/background-bitcoin-orange.png)   <- (136 bytes)   [inscribe №12723302](https://www.ord.io/12723302)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

bitcoin pattern -> ![](i/background-bitcoin-pattern.png)  <- (183 bytes)  [inscribe №12723301](https://www.ord.io/12723301)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

red             -> ![](i/background-red.png)   <- (136 bytes)  [inscribe №12723296](https://www.ord.io/12723296)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

green           -> ![](i/background-green.png)  <- (136 bytes)  [inscribe №12723304](https://www.ord.io/12723304)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

greenback (dollar) pattern  -> ![](i/background-dollar-pattern.png)  <-  (186 bytes)  [inscribe №12723295](https://www.ord.io/12723295)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

blue  ->  ![](i/background-blue.png)  <- (136 bytes)  [inscribe №12723297](https://www.ord.io/12723297)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

aqua  ->  ![](i/background-aqua.png)  <- (136 bytes)  [inscribe №12723293](https://www.ord.io/12723293)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

classic -> ![](i/background-classic.png)  <- (136 bytes)  [inscribe №12723303](https://www.ord.io/12723303)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

rainbow  ->  ![](i/background-rainbow.png)  <- (124 bytes)  [inscribe №12723299](https://www.ord.io/12723299)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

ukraine  -> ![](i/background-ukraine.png)   <- (95 bytes)  [inscribe №12723298](https://www.ord.io/12723298)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

in 4x  (only for documentation - DO NOT INSCRIBE)

![](i/backgrounds@4x.png)

and a sampling of  Martians w/ Backgrounds in 4x (only for documentation - DO NOT INSCRIBE)

![](i/martians-backgrounds@4x.png)

#### Bonus - 1 Happy Smile in 24×24px in .PNG  - DONE!

smile -> ![](i/smile.png)  <- (90 bytes)   [inscribe №12360772](https://www.ord.io/12360772) by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

in 4x (only for documentation - DO NOT INSCRIBE)

![](i/smile@4x.png)

and a sampling of  Martians w/ Smile in 4x (only for documentation - DO NOT INSCRIBE)

![](i/martians-smile@4x.png)

#### Bonus -  2 Noun Glasses in 24×24px in .PNG  - DONE!

noun glasses      -> ![](i/noun-glasses.png)   <- (189 bytes)   [inscribe №12359717](https://www.ord.io/12359717) by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

noun glasses xl   ->  ![](i/noun-glasses_xl.png)  <- (196 bytes)   [inscribe №12359733](https://www.ord.io/12359733)  by  [@612crypto_eth](https://twitter.com/612crypto_eth) - thank you!

in 4x (only for documentation - DO NOT INSCRIBE)

![](i/noun-glasses@4x.png)

and a sampling of Martians w/ Noun Glasses in 4x (only for documentation - DO NOT INSCRIBE)

![](i/martians-noun@4x.png)

###  Step 2:   The Deploy Inscribe - LFG!

SOON!    First with your help let's complete step 1 and than ready to deploy in minutes.

###  Frequently Asked Questions (F.A.Q.) and Answers

> Q: Bro, I can carve parts. What should I do？

See the 24×24px .PNG Inscribes  with the label
"HELP - PLEASE, INSCRIBE!"  above  - pick any .PNG ( each about 200 bytes) and inscribe
and please post in the #generative-orc-721 channel
in the ordinal punks discord   to avoid double sats spending ;-) - double inscribes of 24x24 .PNGs.

If all 10 backgrounds .PNGs and 1,2 or 3 laser eyes .. and the bonus happy smile ... and optinally the noun glasses ...
are inscribed than all is set for step 2 ... Wen deploy?

> Q: Why u say "Let's do the world's 1st (d.i.y) recursive generative"
> why is it [100 D.I.Y. Recursive Martians - Aliens Vol. 2] the 1st?

... the world's 1st (d.i.y.) recursive generative is [100 d.i.y.(recursvie) apes](../diyapes) ...

... now why is the upcoming "100 D.I.Y. (Recursive) Martians - Aliens Vol. 2"  the world's 1st (d.i.y) recursive generative ...

... it is the the world's 1st (d.i.y) true recursive generative mix-n-match collection ...

... you see? ...

...  all recursive attributes to generate  100 d.i.y.(recursvie) apes are sourced from .... ??? ...

.... yes, all recursive attributes are single-sourced from recursive punks  inscribed by a single bro - see <https://ordiscan.com/address/bc1p2wrnw6gkyapz67s7ew422z5j9wt442t48day79pe5lv275at5phqlpn9cn> ...

.... how recursive is that?! ...

... all recursive attributes to generate  100 d.i.y.(recursvie) martians - aliens vol. 2  are sourced from .... ???? ...

... many sources ... many inscribers ... mix-n-match ... yes, that's recursive! ... ( and not yet another inscribed "recursive" .HTML image carousel (anno 2023) that lets you browse other people's ordinals)...

... help to  make it happen today!  inscribe yourself in history and own the (bitcoin) orange 24x24px square
or pattern (background). yes, you can!

## Questions? Comments?

Please post in the #generative-orc-721 channel
in the ordinal punks discord.
For an invite
see <https://twitter.com/OrdinalPunks/status/1620230583711576068>.


text:
require 'cocos'

require_relative 'validate'

##  "title": "Inscription 9992615",

TITLE_RX = /^Inscription (?<num>[0-9]+)$/i

def title_to_num( str )
   if m=TITLE_RX.match( str )
      m[:num].to_i(10)    ## use base 10
   else
     nil   ## not found - raise exception - why? why not?
   end
end

recs = read_csv( "./sandbox/tmp/ordinals.#{SLUG}.csv" )
puts "   #{recs.size} record(s)"

cache_dir = '../ordinals.cache/btc'

num_to_ids = []

mints = []
error_log = ""

OG_MINT_RX = /\A
               og
              [ ]+
               mint
              [ ]+
              /x

## single-line for now
OG_MINT_SLUG_NUMS_RX = /\A
            og
           [ ]+
            mint
           [ ]+
             (?<slug>[a-z][a-z0-9]*)
           [ ]+
            (?<nums>[0-9]+
                 ([ ]+[0-9]+)*
             )
          \z/x

recs.each_with_index do |rec,i|
  id = rec['id']
  ## puts "==> #{i} - #{id}"

  ## step 1)  get metadata records
  meta_path    = "#{cache_dir}/#{id}.json"

  meta = nil
   if !File.exist?( meta_path )
      puts "!! ERROR - meta data record not found"
      exit 1
   end

   meta = read_json( meta_path )

   content_type = meta['content type']
   if !(content_type.start_with?( 'text/' )  ||
        content_type.start_with?( 'application/json'))
      puts "!! expected text/* or application/json inscribe; got:"
      pp meta
      exit 1
   end

   ## puts "   content_type: >#{content_type}<"

   num = title_to_num( meta['title'])
   if num.nil?
     puts "!! ERROR - expected to find incription num in title; got:"
     pp meta
     exit 1
   end

   ## step 2) get content - check for mime type - text/

   path    = "#{cache_dir}/content/#{id}.txt"
   if !File.exist?( path )
    puts "!! ERROR - content not found"
    exit 1
   end

   ## note: always assumes utf8 encoding for now
   content = read_text( path )

  ######
  ## todo/fix - single step - validate json only first
  ######
   errors = []
   data   = nil

   if format == 'text'

      ## strip leading trailing spaces - why? why not?

      ## quick check for now only
      ##   must start with og
       if OG_MINT_RX.match( content.strip ).nil?
          puts "!! SKIP - NO MATCH OG_MINT:"
          puts content
          next
       end

       ## try to convert to json
       m=OG_MINT_SLUG_NUMS_RX.match( content.strip )

       if m.nil?   ## skip for now
          msg = "protocol format -- no pattern match; expected (single) line in the format 'og mint <slug> <nums>'"
          # puts "!! ERROR - #{msg}:"
          # puts content
          errors = [msg]
       else
          data = {
            'p'  => 'orc-721',
            'op' => 'mint',
            's'  => m[:slug],
            'g'  => m[:nums].split( /[ ]+/).map {|num| num.to_i(10) }
            }
          puts data.to_json
          errors = validate_mint( num, data.to_json, deploys: DEPLOYS )
        end
    else ## assume "classic" json

     ## first see if valid json
     begin
       data = JSON.parse( content )
     rescue JSON::ParserError => ex
       ## keep going
     end

   if data
      ## quick fuzzy check if include for mint checking
      ##  p|P == orc-721 (insensitive) must MATCH  AND
      ##  op|OP == mint (insensitive) must MATCH  AND
      ##  s|S|slug|SLUG == <slug> (insensitive) must MATCH
      next if (data['p']||data['P']||'').downcase.strip   != 'orc-721'  ||
              (data['op']||data['OP']||'').downcase.strip  != 'mint'    ||
              (data['s']||data['S']||data['slug']||data['SLUG']||'').downcase.strip != SLUG
   else
      ## use regex fuzzy check (json parse failed!!)
      ## check for orc-721
      p_rx  = /\borc-?721\b/i
      op_rx = /\bmint\b/i
      s_rx  = /\b#{SLUG}\b/i

      next if p_rx.match( content ).nil?  ||
              op_rx.match( content ).nil? ||
              s_rx.match( content ).nil?
   end

    ## note: todo/fix - need to filter out deploys and other ops!
    ##             from error list
    errors = validate_mint( num, content, deploys: DEPLOYS )
  end

   if errors.size != 0
     buf = ""
     buf << "!! ERROR(S) in  #{num} / #{id}:\n"
     buf << content
     buf << "\n\n"
     errors.each do |msg|
        buf << "   - #{msg}\n"
     end
     buf << "\n"

     puts buf              ## print to screen
     error_log << buf      ## auto-add to error log
   else
     slug = data['s']
     if slug != SLUG
      puts "!! ERROR - sorry - only setup for >#{SLUG}<"
      exit 1
     end
     g  = data['g']

     puts "OK  #{num}, #{g.join(' ')}"
     ## add validated mint  - note: dataset values always strings!
     mints << [num.to_s, g.join(' ')]

     num_to_ids << [num.to_s, id]
   end
end

puts "  #{mints.size} mint(s)"

## sort by inscrib num
mints = mints.sort { |l,r|  l[0].to_i(10) <=> r[0].to_i(10) }

## pp mints

### save
##

headers = ['num', 'g']
buf = String.new('')
buf << headers.join( ', ' )
buf << "\n"
mints.each do |values|
  buf << values.join( ', ' )
  buf << "\n"
end

write_text( "./#{SLUG}/mint.csv", buf )

write_text( "./#{SLUG}/error.txt", error_log )

## sort by inscrib num
num_to_ids = num_to_ids.sort { |l,r|  l[0].to_i(10) <=> r[0].to_i(10) }

headers = ['num', 'id']
buf = String.new('')
buf << headers.join( ', ' )
buf << "\n"
num_to_ids.each do |values|
  buf << values.join( ', ' )
  buf << "\n"
end

write_text( "./market/#{SLUG}_ids.csv", buf )

puts "bye"

repo_language: Ruby

mime_type: text/plain


text:
###
## todo/check:
##    make all string values case-insensitive - why? why not?
##       orc-721 == ORC-721
##        mint   == MINT == Mint == mInT
##       diypunks == DiyPunks  etc.

def validate_mint( num, content, deploys: {} )
  errors = []

  ###  1) check for valid json
  h = nil
  begin
    h = JSON.parse( content )
    ## puts "   OK - json parse"
  rescue JSON::ParserError => ex
    msg = "json parse -- #{ex.message}"
    errors << msg
    ## puts "   !! ERROR - #{msg}"
  end

  if h
    ###  2) check for protocol required keys  - p,op,s,g
    ##          todo: allow (long-form) alternative for s e.g. slug
    ##          todo: allow (long-form) alternative for g e.g. generative?
    ['p','op','s','g'].each do |key|
       if h.has_key?( key )
          ## continue
       else
          msg = "protocol format -- required key '#{key}' not found in inscribe text"
          errors << msg
          ## puts "   !! ERROR - #{msg}"
       end
    end

    ## 3) check for protocol values
    if errors.size == 0
      value = h['p']
      if value != 'orc-721'
        msg = "protocol format -- expected value 'orc-721' for key 'p'; got '#{value}'"
        errors << msg
      end
    end

    if errors.size == 0
      value = h['op']
      if value != 'mint'
        msg = "protocol format -- expected value 'mint' for key 'op'; got '#{value}'"
        errors << msg
      end
    end

    if errors.size == 0
      slug = value = h['s']

       ## slug must use this regex (texp pattern) format
       ##  note: MUST start with a-z (NOT numbers or _-)
       ##  - todo/check - limt the length of slug at 64, 128 or such???
       ##     - check .com domain names - what is max length?
       ##
       ##  - todo/check - allow more special chars e.g. - dot(.) - why? why not?
       ##                                               - at(@)
       ##                                               - plus(+)
       ##   - again check / try to use format for .com domain names
       slug_re = /[a-z][a-z0-9_-]*/

       if slug_re.match( value ).nil?
        msg = "protocol format -- invalid slug '#{value}'; must use the format /[a-z][a-z0-9_-]*/"
        errors << msg
       else
        deploy = deploys[value]

        if deploy.nil?
          msg = "protocol -- no deploy found for slug '#{value}'"
          errors << msg
        else
         ###  check for mint ord num GREATER deploy ord num.
         ## pp deploy
         deploy_num = deploy['num']
         ## pp deploy_num
         if deploy_num > num
             msg = "protocol -- '#{slug}' mint inscribe no. #{num} lower than deploy inscribe no #{deploy_num}"
             errors << msg
         else
            ## check for g
            g = values =  h['g']
            if values.size == 0   ## empty array
              msg = "protocol format -- empty g"
              errors << msg
            end
            if errors.size == 0
              ## check for g in range of deploy
              ##   note: for now allow to repeat numbers e.g. [0,0,0] is ok
              ##          or [0,1,1,2,1,2]
              deploy_g = deploy['g']
               values.each do |value|
                    ##
                    ## check for value - MUST be a integer number
                    if value.is_a?( Integer )
                      if value >= deploy_g
                        msg = "protocol --  g no. #{value} out-of-range 0-#{deploy_g-1} (#{deploy_g}) in '#{slug}' mint"
                        errors << msg
                      end
                    else
                       msg = "protocol format -- g no. #{value} not an integer number; got type #{value.class.name}"
                       errors << msg
                    end
               end
            end
         end
        end
     end
    end
  end

  errors
end


text:
!! ERROR(S) in  11803365 / 5fcb29cc6fbde63e25a7b656c74d74a765cd08c04d4e4b23bcbe5f27cc639956i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0]}

   - protocol -- 'diyapes' mint inscribe no. 11803365 lower than deploy inscribe no 11803822

!! ERROR(S) in  11803366 / 5a3da64c5f4d8c17edec6506a18823cecb51023a1e512eaaf82233343abfb64fi0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 16, 5]}

   - protocol -- 'diyapes' mint inscribe no. 11803366 lower than deploy inscribe no 11803822

!! ERROR(S) in  11803367 / 1044f27b4b47b1019cc7e9a502d9aa83e99e27bf119ab5f918632c8c0f9f3c55i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 24, 7]}

   - protocol -- 'diyapes' mint inscribe no. 11803367 lower than deploy inscribe no 11803822

!! ERROR(S) in  11803368 / 75adf015104b78ff37e0f0ecfff5339e4c906782e90fad3751560121200e49cdi0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 22, 1]}

   - protocol -- 'diyapes' mint inscribe no. 11803368 lower than deploy inscribe no 11803822

!! ERROR(S) in  11806691 / fb2bb3f2455a2d1f80c8c5b2f5e2036164c2c5c26200734db9f9576848e1a4c1i0:
{"p": "orc-721","op": "mint","s": "diyapes","g": [0, 13, 26]}

   - protocol --  g no. 26 out-of-range 0-25 (26) in 'diyapes' mint

!! ERROR(S) in  11820210 / 6f249a983ed2d04dec2b130f0c875a217930172283e756e125daf51cddc01c44i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 3, 3, 5, 14, 23]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 3, 3, 5, 14, 23]'

!! ERROR(S) in  11820229 / 72bdf3b819b8a859aae866f1a118dafff5b9d6beb3e3ea504f49bbf34c9e51e3i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 5, 16, 23, 1]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 5, 16, 23, 1]'

!! ERROR(S) in  11820260 / 859323d929be46caf2f3f64ba027664906ea314eecb7d75496f89377483ea6c1i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 14, 23, 20, 21]
{"p":"orc-721","op":"mint","s":"diyapes","g":[10, 0, 14, 21, 20, 25]
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 14, 20, 21]
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 3, 14, 20, 21, 22]
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 14, 23, 21, 20]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 14, 23, 20, 21]
{"p":"orc-721","op":"mint","s":"diyapes","g":[10, 0, 14, 21, 20, 25]
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 14, 20, 21]
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 3, 14, 20, 21, 22]
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 14, 23, 21, 20]'

!! ERROR(S) in  11820261 / a5947a824d3f8de50ffe68a736fd26e034fe8b54c389a734bb48523273554c8fi0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 14, 23, 20, 9, 21]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 14, 23, 20, 9, 21]'

!! ERROR(S) in  11820264 / 36227a5d566e618a900a895118b002a842e44c03f88a0fd9d3777eb446886145i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 9, 8, 7, 10, 14, 20, 21, 23]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 9, 8, 7, 10, 14, 20, 21, 23]'

!! ERROR(S) in  11820270 / 04aeb9a321464eb98a2677d2eda1b07c0fed087463763f503015d591aca12ca6i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 21, 20, 14]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 10, 21, 20, 14]'

!! ERROR(S) in  11820481 / c7ed12c7e3f9adf82cf22fcf0128c54bd4126d4de6682658597987a1cd581680i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 6, 20, 13]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 6, 20, 13]'

!! ERROR(S) in  11820482 / 5237d725062ed22def8c0cd94e068719c7b6a9461d96253af15b22ded37314efi0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 22, 20, 21, 5, 16]

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 22, 20, 21, 5, 16]'

!! ERROR(S) in  11824990 / 78a344d3368d557def26ee0b4de3405386154bad463f8eb14efabccb109820a8i0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0, 5，20]}

   - json parse -- 451: unexpected token at '，20]}'

!! ERROR(S) in  11829170 / a9a9341bce610fc5119488b01443185e54441e7a0f079b23cc81eb610eb13cbci0:
{"p":"orc-721","op":"mint","s":"diyapes","g":[0,3,19,22]}
{"p":"orc-721","op":"mint","s":"diyapes","g":[20,0,1,17,4]}

   - json parse -- 859: unexpected token at '{"p":"orc-721","op":"mint","s":"diyapes","g":[20,0,1,17,4]}'


text:
# D.I.Y. (Recursive) Apes (max. 100)

## Fam

1x

![](i/diyapes.png)

4x

![]()

![](i/diyapes@4x.png)

## Wen Deploy?

here's everything to make it happen
(no worries - don't wait for me - please go ahead - LFG!) and please post the link to the deploy inscription in the #generative-orc-721 channel.

here's the magic ORC-721 deploy text to inscribe (the max limit set to 100 plus the 26 recursive inscription ids (0-25) for the image generation) ...

``` json
{
    "p": "orc-721",
    "op": "deploy",
    "slug": "diyapes",
    "name": "D.I.Y. Apes",
    "max": 100,
    "dim": "24x24",
    "generative":
["b36750a6b444e3815f0cbb50a36e0f1231b74ba930855b1e9067f907942f34fci0",
 "5ce9f89ad571e5380baa5b5ee387f08ea313421e7e54662b3899d411c39321ddi0",
 "1355524a2aab576e069bac91227b0e52d227d65d84c5535377d3a0ea4e44d470i0",
 "a6b4b81f69e8c217db24f0a71954195d67ced49a819b67a4daf9f3ca7fa1b971i0",
 "83827ec13cb55a35fe3adca5acf67caf943c3bd6810f8fa893b067e8015c8f19i0",
 "5b1e638c050318bec23f17b8b7758ccf13945e422516da6c722c67ae5ed4e26di0",
 "5dcf96b13e5762d5a288d8bee36deb933fe192a55475199fe9a39ae29dd16853i0",
 "5760ce05009e94a750a7245cac994fa9ffd388eadc757929ac17737811455429i0",
 "0bd902941392ea138adb7db30cecdf5bc09a92c80e3e1bc3ecdf3c2d0abf6631i0",
 "7c2fd41b52624ddb1ba11fe1c6d95475f2e42c4b53d6aaf6a16a09064acebe38i0",
 "0f473c9dcd14e3f43a6599b038d810eac16bc6394edcfcf6b32f8df992ab6791i0",
 "d32c50c23693a028e2381d6f756746a9ff684f2028edf694ab7b1b6cde78e2cdi0",
 "d61fc2a89ecc6ae65cf91cdfac9edc37fd60c38621dac211f3a70891ef79b69ai0",
 "680e2ee8cad86aa174b4f3373d733370c9a6fc4230b9708d520a0f6bcb8e72a6i0",
 "56d3f4f661b2b4a9fc17755171d7cf4da74e570614b6b45de0cc87a809c3eb3ci0",
 "fe4321178bd841e52fdeb72ce4456c5b7596c0d611b19da15ba75ec63b5314cai0",
 "eddc1242f0fd290e130332e046897ad41dce1e7e112df48ecf2168e43172d383i0",
 "a2110fb4afaa29bc70bcfac445f750ecb5e81777e8d080be2d2b07eb030ba0ffi0",
 "c1277df4b986067b2a3f006d717b7f6d042896840c8b592e5a8b9ff22444b08fi0",
 "722dfdc90a67ff7eb892d13393a8a5b360b8a109f3d809600919684a600ff60ei0",
 "06136a5b4fb585069ef6265a0fde3baf67ee914b9f784d2c951f3a8187800d54i0",
 "8043604c7c96a5a43a97e251b246102ca40c0203431ff21bd26f23330dfa554ci0",
 "92e7f48454546718f98103d7464d954033adbee21855f06584be06faa3e291ddi0",
 "a01012b213ed425c5d4038bc36016f19f4f342ca052ff9bf6971672164e1a402i0",
 "87d89d290ebde5d5b7aa75b4c8d0359515e25ea1542bc0646dc3f5b0b2fc55fdi0",
 "aab67a4269ca0bda649fe341bd88c862aba2e9bf6e0826b9dfa5c4ba8fe62c2di0"]
}
```

NOTE:  as always please double check
that your copy-n-paste text in json format is valid e.g. ->  https://jsonlint.com/

For the D.I.Y. Apes (max. 100)  image previewer - see https://ordbase.github.io/generative-orc-721/diyapes   and for a cheatsheet /  list of attributes (0-25) with categories / structure - see https://github.com/ordbase/generative-orc-721/blob/master/diyapes/meta.csv

PS: For the mint text use - and fill-in the g numbers:

``` json
{
   "p":"orc-721",
   "op":"mint",
   "s":"diyapes",
   "g":[]
}
```

Example 1 - Ape

``` json
{
   "p":"orc-721",
   "op":"mint",
   "s":"diyapes",
   "g":[0]
}
```

![](i/ape-0.png)

4x

![](i/ape-0@4x.png)

Example 2 - Ape / Beanie / 3D Glasses

``` json
{
   "p":"orc-721",
   "op":"mint",
   "s":"diyapes",
   "g":[0,10,14]
}
```

![](i/ape-0_10_14.png)

4x

![](i/ape-0_10_14@4x.png)

Example 2 - Ape / Mohawk / Earring

``` json
{
   "p":"orc-721",
   "op":"mint",
   "s":"diyapes",
   "g":[0,1,20]
}
```

![](i/ape-0_1_20.png)

4x

![](i/ape-0_1_20@4x.png)

Here be dragons. Happy minting D.I.Y. Apes (max. 100).  Wen deploy?

## Questions? Comments?

Please post in the #generative-orc-721 channel
in the ordinal punks discord.
For an invite
see <https://twitter.com/OrdinalPunks/status/1620230583711576068>.


text:
#  (Recursive) Inscribes

## Recursive Punks

attributes @
  https://ordiscan.com/address/bc1p2wrnw6gkyapz67s7ew422z5j9wt442t48day79pe5lv275at5phqlpn9cn

recursive punks
- https://github.com/RecursivePunks
- https://github.com/RecursivePunks/RecursivePunks

description in meta.json:

> The first 10k recursive collection in ordinals.
All Punks in the collection have been regenerated by using pre-inscribed traits.
These traits are being combined into a new inscription
to regenerate the original punks into an svg file.

website @ https://recursivepunks.io

> Recursive Punks is the first 10k Recursive ordinals collection.
The original Punks are being recreated by combining different pre-inscribed traits.
>
> Note: All Recursive Punks SVGs are already inscribed.
First = First.
To check of you had the first one check the BitPunks explorer (bottom left).

twitter @ https://twitter.com/recursivepunks

> Recursive Punks on Bitcoin Ordinals.
> All Punks in the collection have been regenerated by using pre-inscribed traits
> and combining them in 10k SVGs. Free mint.

How do these "recursive inscriptions" work?
All punk traits have been inscribed in ordinals (view them here).
These traits are being combined into
a new inscription to regenerate the original punks into an svg file.

SVG Example (broken recursive syntax):

``` svg
<svg width="24px" height="24px" xmlns="http://www.w3.org/2000/svg">
  <image href="/-/content/:7fbfed7e38bbcaf851c2c4426b4c4ede9d09b6e6fd87a040403852681c7c19c2i0" />
  <image href="/-/content/:128d1e42f85e67d2a6b0c4c78e9ad47f7d66ed7699e77ddd0a4f0b8a21cdf736i0" />
  <image href="/-/content/:62ec589582651e49ed722241dab3bdb93fbd8ddf3fab3d891a30165126dddbcfi0" />
  <image href="/-/content/:b866e8f3f51c385a3ae27e65c5abe68e6086a6b74935b1b692de8587f5858148i0" />
</svg>
```

note - ordiscan.com shows "submodules"  - recursive content (attributes)

- https://ordiscan.com/inscription/11632696

markets:
- https://magiceden.io/ordinals/marketplace/recursivepunks
- https://gamma.io/ordinals/collections/recursive-punks

(re)usage

Fusion Punks
-  https://www.ord.io/12281731

## Recursive Noun Punks

atributes @
https://ordiscan.com/address/bc1pv5ru9czkg6eks4eqeal8mukw7rhnk32rch7nj89p2wgwwlwszw8q48ywhe

> Nounified Punks. Recursive Ordinals. Free mint.
> As small as 463 bytes. Supply of 155 items. Inscription fees as low as $1.5.
>  Creatie Commons Zero (CC0).
> All Recursive Noun Punks are fully unique. Mint can only be done via Twitter
> and it's completely free.

- website: https://inscribednouns.com
- twitter: https://twitter.com/inscribednouns

SVG Example:

``` svg
<svg width="100%" height="100%"
     image-rendering="pixelated" xmlns="http://www.w3.org/2000/svg">
  <image width="100%" height="100%" href="/content/424af19c112d366d3c4a2ece82ef66316eb5855a32433bd0b29a29c46b144d6di0" />
  <image width="100%" height="100%" href="/content/0f635374c2f60a7e34e2eb731bce23a5bc44d3a112ad02aceb23ea42606f6992i0" />
  <image width="100%" height="100%" href="/content/efc6a4699c2cee6f305c72911df16a3dcf29fe75913b007607f175339485bf78i0" />
  <image width="100%" height="100%" href="/content/7c2fd41b52624ddb1ba11fe1c6d95475f2e42c4b53d6aaf6a16a09064acebe38i0" />
  <image width="100%" height="100%" href="/content/2c2d812754b9374ffb699173da7f6d476af138a99906b66b8453cc4343305167i0" />
</svg>
```

note - ordiscan.com shows "submodules"  - recursive content (attributes)

- https://ordiscan.com/inscription/12216793

markets:
- <https://magiceden.io/ordinals/marketplace/recursive-nounpunks>


text:
> "To iterate is human, to recurse divine."
>
>  -- God (There Only Can Be One Maxi Club Member)

# Quick Commentary / Notes on Recursive Ordinals

tldr;  love recursive ordinals. LFG! let's make bitcoin magic again and change the bitcoin code, not the climate!
Wen bigger?  Wen bigger L1 (layer 1) blocks?

> Q: u see these new recursive ordinals ?

only seen for now (not studied / read-up in detail) ...
 here's my blurb:    thanks for highlighting recursive ordinals ... looks great ...
and great naming ...
let's see what people do / come-up with using the new ordinal (recursive) machinery. love it. LFG!
 let's make bitcoin magic again (and change the bitcoin code, not the climate)!

> Q: ya seems like there's a lot of similarities between the concepts of gen orc-721 and recursive ords

sorry - i haven't studied / read-up in detail about recursive ordinals  and haven't seen what people do use it for ... see above.
PS: ORC-721 is generative NOT recursive ...
so this might give generative  ORC-721 new recursive super-powers ...    for now i see it as 2+2 = 4

... reading-up - see https://github.com/ordinals/ord/pull/2174/files
 that looks like the upcoming documentation  about recursive  ordinals

PS: if anyone is interested in comparing apple & organges -
here's the generative-ORC-721 docu -> https://github.com/ordbase/generative-orc-721

.. again as far as i can tell this is a better together world and not the classic maxi way -
there only can be one. happy to hear your take.
is recursive the new generative? or is recursive generative the new new?

... one more thing ... asked in the generative-orc-721  ... yes, "composability" or "recursive composites" will get added to ORC-721  SOON!   ... and more formats .. starting with vector graphics e.g. svg -    for on how NOT to do "composability"
or "recursive composites"
or such in generatives see CRC-721 -> https://github.com/kelvinink/crc-721

.. by the way ... the biggest road block ahead on bitcoin ordinals is ....   the block size limit!  yes, make it bigger!    ordinals work because people want to store content on L1 (layer 1)!      sorry thinking out loud.  let the market decide - what data package has value - every package by definition is a sequened (long count) ordinal that you can trade (buy/sell) ...

... and  if i dare to say "smart contracts" are ded ...  why?
... hint: try to upgrade your "smart" contract ...  change the code ... ha ...
... if you store the data on L1 ... and than use an "off-chain" protocol .. than - guess what? - yes, you can upgrade the protocol  .... change the bitcoin code, not the climate! it is a protocol and not a "smart contract".
... anyways, all i am trying to say is that ORC-721 is a protocol  ... happy to see "smart contract" stored on L1  using "recursive ordinals"  for generatives .   See above - and sure - all speculation and too early to tell. who knows.  by the way my tagline  on github is if you check  "no coiner having fun staying poor and wrong."

PS:   here's a joke about eth maxi to illustrate:

eth maxi:    i can deploy a token in 5 minutes [with "smart contract"]!

bitcoin (ordinal) maxi:       hold my beer my friend ...
... 10 seconds later. done.
i deployed 721 punks now!   no "smart contract" ...  see the one-liner inscribe here-> https://ordinals.com/inscription/753f663770d816f61acd35da8dd04e122eec8582e93ca36b2122f2d4ac206089i0        get your free mint.  cheers. prost!

**Updates**

... reading-up ... this might be a new real-world recursive expirement to follow to learn & understand more about the new magic:

> Everyone in the Ordinals space should be paying attention
>  to what @OnChainMonkey is doing here.
>  They've inscribe two npm packages fully on-chain onto Bitcoin which will be public goods
>  that anyone can leverage to make fully on-chain, generative art similar to Art Blocks...

love it. LFG!  Wen D.I.Y. Punks by@OnChainMonkey?

PS:  anyways -  call my "old school" - i don't see the point of inscribing npm (javascript open source) packages ... there are public versions on the internets...  by the way ... microsoft has an artic vault of all github repos -> https://archiveprogram.github.com/arctic-vault/
if anyone is worried, the code is going away ...   the website explains -
How the cold storage will last 1000+ years   ... now please help me explain how bitcoin mining will work in 200 years ;-).

... a little public service announcement -   computer programming is a never-ending bug fixing odysee ... in the blockchain you inscribe data (and why not code? code is data!)  - no change possible -  sure - inscribe new versions (again and again and again and again and again...)  .... imagine if the bitcoin protocol is set in stone - than it's ded -  (hello bitcoin maxis ;-) - do you love the new ordinal kids on the block?)  -  change the (bitcoin) code, not the climate - see the point?  use upgradable "off-chain" protocols and store / inscribe the data "on-chain" forever unchangeable.

ha. allow me one last comment ... i saw this coming...

> You're now running Bitcoin ON Bitcoin.

mind blown or can it get any more stupid than that?!       -
as an "old school" computer programmer let me tell you we can run windows in windows in windows or firefox inside firefox inside firefox  ...
that is the challenge  ...  Bitcoin ON Bitcoin ON Bitcoin -  make it happen!  make it recursive (all the way down)! -
the quote is from the recursive ordinals explainer here -> https://twitter.com/ordinalhub/status/1668075272132870145

What's your take?   You are welcome to join the ongoing is ORC-721 ded? debate
in the ordinal punks discord (in the #generative-orc-721 channel).
For an invite
see <https://twitter.com/OrdinalPunks/status/1620230583711576068>.


text:
$LOAD_PATH.unshift( "../ordbase/ordinals/lib" )
$LOAD_PATH.unshift( "../ordbase/ordlite/lib" )
require 'ordlite'

OrdDb.open( './ord.db' )

puts
puts "  #{Inscribe.count} inscribe(s)"
puts "  #{Blob.count} blob(s)"
puts "  #{Collection.count} collection(s)"
puts "  #{Factory.count} factories"
puts "  #{Generative.count} generative(s)"


text:
####
#  to run use
#    $ ruby generate_v2/diybirdies.rb

require_relative 'helper'

## note: change outdir (root for /num & /diybirdies)
##          to where you want to save the generated images
# outdir = '../ordbase.github.io'
outdir = './tmpv2'

## step 1 - read database "factory" record, that is, ordgen / ORC-721 deploy inscribe
rec = Factory.find( 'diybirdies' )

puts "==> #{rec.id} >#{rec.name}< max. #{rec.max} - #{rec.dim} - inscribe no. #{rec.inscribe.num} - #{rec.inscribe.date}"

puts "   #{rec.layers.count} layer(s):"

generator = rec.generator
puts "      #{generator.count} tile(s)"

## step 2 - read mint records
puts "  #{rec.generatives.count} generative(s)"
generatives = rec.generatives.joins(:inscribe)
                 .order('num').limit( rec.max )  ## cut-off "cursed" overflow "negatives" if any

## step 3 - auto-generate public images

generatives.each_with_index do |gen,i|
  num  = gen.inscribe.num
  id   = gen.inscribe.id

  g   = generator._parse( gen.g )

  puts "==> bird no. #{i} @ #{num} - g: #{g.inspect}"

  img = generator.generate( *g )

  img.save( "#{outdir}/num/#{num}.png" )
  img.zoom(4).save( "#{outdir}/num/#{num}@4x.png" )

  img.save( "#{outdir}/content/#{id}.png" )
end

puts "bye"


text:
####
#  to run use
#    $ ruby generate_v2/diypunks.rb

require_relative 'helper'

## note: change outdir (root for /num & /diypunks)
##          to where you want to save the generated images
# outdir = '../ordbase.github.io'
outdir = './tmpv2'

## step 1 - read database "factory" record, that is, ordgen / ORC-721 deploy inscribe
rec = Factory.find( 'diypunks' )

puts "==> #{rec.id} >#{rec.name}< max. #{rec.max} - #{rec.dim} - inscribe no. #{rec.inscribe.num} - #{rec.inscribe.date}"

puts "   #{rec.layers.count} layer(s):"

generator = rec.generator
puts "      #{generator.count} tile(s)"

## step 2 - read mint records
recs = read_csv( "./diypunks/mint.csv" )
puts "   #{recs.size} record(s)"

# cut-down to max. limit
# recs = recs[0, 100]
# puts "   #{recs.size} record(s)"

## step 3 - auto-generate public images
recs.each_with_index do |rec,i|
  num = rec['num']
  g   = generator._parse( rec['g'] )

  puts "==> punk no. #{i} @ #{num} - g: #{g.inspect}"

  img = generator.generate( *g )

  img.save( "#{outdir}/num/#{num}.png" )
  img.zoom(4).save( "#{outdir}/num/#{num}@4x.png" )

  img.save( "#{outdir}/diypunks/#{g.join('_')}.png" )
  img.zoom(4).save( "#{outdir}/diypunks/#{g.join('_')}@4x.png" )
end

puts "bye"


text:
####
#  to run use
#    $ ruby generate/btcwords.rb

require_relative 'helper'

## note: change outdir (root for /num & /diypunks)
##          to where you want to save the generated images
outdir = '../ordbase.github.io'
# outdir = './tmpv2'

## step 1 - read database "factory" record, that is, ordgen / ORC-721 deploy inscribe
rec = Factory.find( 'btcwords' )

puts "==> #{rec.id} >#{rec.name}< max. #{rec.max} - #{rec.dim} - inscribe no. #{rec.inscribe.num} - #{rec.inscribe.date}"

puts "   #{rec.layers.count} layer(s):"

generator = rec.generator
puts "      #{generator.count} tile(s)"

## step 2 - read mint records
puts "  #{rec.generatives.count} generative(s)"
generatives = rec.generatives.joins(:inscribe)
                 .order('num').limit( rec.max )  ## cut-off "cursed" overflow "negatives" if any

## step 3 - auto-generate public images
generatives.each_with_index do |gen,i|
  num  = gen.inscribe.num
  id   = gen.inscribe.id

  g   = generator._parse( gen.g )

  puts "==> word no. #{i} @ #{num} - g: #{g.inspect}"

  img = generator.generate( *g )

  img.save( "#{outdir}/num/#{num}.png" )
  img.zoom(4).save( "#{outdir}/num/#{num}@4x.png" )

  img.save( "#{outdir}/content/#{id}.png" )
end

puts "bye"


text:
####
#  to run use
#    $ ruby generate_v2/diyapes.rb

require_relative 'helper'

## note: change outdir (root for /num & /diypunks)
##          to where you want to save the generated images
outdir = './tmpv2'

## step 1 - read database "factory" record, that is, ordgen / ORC-721 deploy inscribe
rec = Factory.find( 'diyapes' )

puts "==> #{rec.id} >#{rec.name}< max. #{rec.max} - #{rec.dim} - inscribe no. #{rec.inscribe.num} - #{rec.inscribe.date}"

puts "   #{rec.layers.count} layer(s):"

generator = rec.generator
puts "      #{generator.count} tile(s)"

## step 2 - read mint records
recs = read_csv( "./diyapes/mint.csv" )
puts "   #{recs.size} record(s)"

# cut-down to max. limit
# recs = recs[0, 100]
# puts "   #{recs.size} record(s)"

## step 3 - auto-generate public images
recs.each_with_index do |rec,i|
  num = rec['num']
  g   = generator._parse( rec['g'] )

  puts "==> apes no. #{i} @ #{num} - g: #{g.inspect}"

  img = generator.generate( *g )

  img.save( "#{outdir}/num/#{num}.png" )
  img.zoom(4).save( "#{outdir}/num/#{num}@4x.png" )

  img.save( "#{outdir}/diyapes/#{g.join('_')}.png" )
  img.zoom(4).save( "#{outdir}/diyapes/#{g.join('_')}@4x.png" )
end

puts "bye"


text:
!! ERROR(S) in  13079734 / 0fd13e2dbe58bc8afda8f7971f6589eabe47be1c77a9fbe029b689e57f400520i0:
"p":"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[128, 130, 132, 134, 174, 184, 222, 232, 270, 280, 297, 302, 317, 328, 342, 376, 390, 424, 438, 472, 486, 514, 516, 518, 534, 562]
}

   - json parse -- unexpected token at ':"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[128, 130, 132, 134, 174, 184, 222, 232, 270, 280, 297, 302, 317, 328, 342, 376, 390, 424, 438, 472, 486, 514, 516, 518, 534, 562]
}'

!! ERROR(S) in  13079968 / ea158398b208bced849c842d60913b82de5109d7e788e4c9dcf5a377e0cbdfd0i0:
"p":"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[128, 129, 130, 131, 132, 133, 134, 151, 159, 174, 177, 178, 179, 180, 181, 184, 198, 200, 206, 208, 222, 224, 226, 227, 228, 230, 232, 246, 248, 250, 252, 254, 256, 270, 272, 274, 276, 278, 280, 293, 295, 297, 300, 302, 304, 317, 319, 321, 324, 326, 328, 342, 344, 346, 348, 350, 352, 366, 368, 370, 372, 374, 376, 390, 392, 394, 396, 398, 400, 414, 416, 418, 419, 420, 422, 424, 438, 440, 446, 448, 462, 464, 465, 466, 467, 468, 469, 472, 486, 488, 495, 510, 512, 514, 515, 516, 517, 518, 534, 536, 538, 558, 560, 562]
}

   - json parse -- unexpected token at ':"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[128, 129, 130, 131, 132, 133, 134, 151, 159, 174, 177, 178, 179, 180, 181, 184, 198, 200, 206, 208, 222, 224, 226, 227, 228, 230, 232, 246, 248, 250, 252, 254, 256, 270, 272, 274, 276, 278, 280, 293, 295, 297, 300, 302, 304, 317, 319, 321, 324, 326, 328, 342, 344, 346, 348, 350, 352, 366, 368, 370, 372, 374, 376, 390, 392, 394, 396, 398, 400, 414, 416, 418, 419, 420, 422, 424, 438, 440, 446, 448, 462, 464, 465, 466, 467, 468, 469, 472, 486, 488, 495, 510, 512, 514, 515, 516, 517, 518, 534, 536, 538, 558, 560, 562]
}'

!! ERROR(S) in  13113810 / 2b79a933e4e9a19c73d7fbb83e26f8ea82da78aaf9f4637f8eed5f406bfe5222i0:
you can inscribe using the slug 'orangepixels'. Like this but use your own "g" values:
{
   "p":"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[128, 129, 130, 131, 132, 133, 134, 151, 159, 174, 177, 178, 179, 180, 181, 182, 184, 198, 200, 207, 208, 222, 223, 232, 246, 256, 270, 272, 273, 274, 278, 279, 280, 293, 296, 297, 298, 302, 303, 304, 317, 320, 321, 322, 326, 327, 328, 342, 352, 366, 376, 390, 391, 400, 414, 415, 420, 424, 438, 440, 444, 447, 448, 462, 465, 466, 470, 472, 486, 491, 492, 493, 495, 510, 514, 515, 516, 517, 518, 534, 538, 558, 562]
}

   - json parse -- unexpected token at 'you can inscribe using the slug 'orangepixels'. Like this but use your own "g" values:
{
   "p":"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[128, 129, 130, 131, 132, 133, 134, 151, 159, 174, 177, 178, 179, 180, 181, 182, 184, 198, 200, 207, 208, 222, 223, 232, 246, 256, 270, 272, 273, 274, 278, 279, 280, 293, 296, 297, 298, 302, 303, 304, 317, 320, 321, 322, 326, 327, 328, 342, 352, 366, 376, 390, 391, 400, 414, 415, 420, 424, 438, 440, 444, 447, 448, 462, 465, 466, 470, 472, 486, 491, 492, 493, 495, 510, 514, 515, 516, 517, 518, 534, 538, 558, 562]
}'

!! ERROR(S) in  13113811 / 6781bdd5098862b7783807f272f780352ffdc7c1419eea5352e3dfa47962665fi0:
you can inscribe using the slug 'orangepixels'. Like this but use your own "g" values:
{
   "p":"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[28, 29, 30, 31, 32, 33, 34, 41, 42, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 64, 65, 66, 73, 74, 75, 76, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 98, 99, 100, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 123, 124, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 220, 221, 222, 223, 227, 228, 229, 230, 233, 243, 244, 245, 246, 252, 253, 257, 266, 267, 268, 269, 270, 274, 276, 277, 279, 281, 289, 290, 291, 292, 293, 294, 295, 298, 300, 301, 303, 305, 315, 316, 317, 318, 319, 324, 325, 328, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, 363, 364, 365, 366, 367, 368, 369, 370, 372, 373, 376, 386, 387, 388, 389, 390, 391, 392, 400, 414, 415, 418, 424, 438, 439, 443, 444, 445, 448, 462, 463, 472, 486, 487, 488, 495, 510, 511, 512, 513, 514, 515, 516, 517, 518, 534, 535, 536, 537, 538, 558, 559, 560, 561, 562]
}

   - json parse -- unexpected token at 'you can inscribe using the slug 'orangepixels'. Like this but use your own "g" values:
{
   "p":"orc-721",
   "op":"mint",
   "s":"orangepixels",
   "g":[28, 29, 30, 31, 32, 33, 34, 41, 42, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 64, 65, 66, 73, 74, 75, 76, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 98, 99, 100, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 123, 124, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 220, 221, 222, 223, 227, 228, 229, 230, 233, 243, 244, 245, 246, 252, 253, 257, 266, 267, 268, 269, 270, 274, 276, 277, 279, 281, 289, 290, 291, 292, 293, 294, 295, 298, 300, 301, 303, 305, 315, 316, 317, 318, 319, 324, 325, 328, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, 363, 364, 365, 366, 367, 368, 369, 370, 372, 373, 376, 386, 387, 388, 389, 390, 391, 392, 400, 414, 415, 418, 424, 438, 439, 443, 444, 445, 448, 462, 463, 472, 486, 487, 488, 495, 510, 511, 512, 513, 514, 515, 516, 517, 518, 534, 535, 536, 537, 538, 558, 559, 560, 561, 562]
}'

!! ERROR(S) in  14935408 / ad2a41fd4fcb671edd6143cea44f114c72777ec428aabf96ff12152ccc5a7a16i0:
{"p":"orc-721","op":"mint","s":"orangepixels","g":129, 133, 150, 151, 153, 154, 155, 156, 157, 159, 175, 176, 177, 178, 179, 180, 181, 182, 200, 201, 202, 203, 204, 206, 225, 227, 228, 229, 230, 231, 249, 250, 251, 252, 253, 254, 256, 257, 273, 274, 275, 276, 277, 279, 280, 281, 282, 298, 299, 300, 301, 303, 305, 307, 321, 322, 323, 324, 327, 328, 329, 330, 331, 345, 347, 348, 369, 370, 371, 372, 392, 393, 394, 395, 414, 415, 416, 417, 419, 420, 437, 438, 440, 441, 442, 443, 444, 460, 462, 463, 464, 466, 468, 486, 488, 490, 492}

   - json parse -- unexpected token at '{"p":"orc-721","op":"mint","s":"orangepixels","g":129, 133, 150, 151, 153, 154, 155, 156, 157, 159, 175, 176, 177, 178, 179, 180, 181, 182, 200, 201, 202, 203, 204, 206, 225, 227, 228, 229, 230, 231, 249, 250, 251, 252, 253, 254, 256, 257, 273, 274, 275, 276, 277, 279, 280, 281, 282, 298, 299, 300, 301, 303, 305, 307, 321, 322, 323, 324, 327, 328, 329, 330, 331, 345, 347, 348, 369, 370, 371, 372, 392, 393, 394, 395, 414, 415, 416, 417, 419, 420, 437, 438, 440, 441, 442, 443, 444, 460, 462, 463, 464, 466, 468, 486, 488, 490, 492}'

!! ERROR(S) in  14935420 / b225e56b7a0f4a5f38db9ef2cafbed7ec8a0b9e58bdc991c0b0605ab6a916523i0:
{"p":"orc-721","op":"mint","s":"orangepixels","g":36, 37, 59, 60, 61, 82, 83, 84, 85, 105, 106, 107, 108, 109, 128, 129, 130, 131, 132, 133, 134, 151, 159, 174, 184, 198, 208, 222, 232, 246, 256, 270, 280, 293, 297, 302, 304, 317, 328, 342, 352, 366, 372, 373, 376, 390, 400, 414, 424, 438, 443, 444, 445, 448, 462, 472, 486, 495, 510, 514, 515, 516, 517, 518, 534, 538, 558, 562}

   - json parse -- unexpected token at '{"p":"orc-721","op":"mint","s":"orangepixels","g":36, 37, 59, 60, 61, 82, 83, 84, 85, 105, 106, 107, 108, 109, 128, 129, 130, 131, 132, 133, 134, 151, 159, 174, 184, 198, 208, 222, 232, 246, 256, 270, 280, 293, 297, 302, 304, 317, 328, 342, 352, 366, 372, 373, 376, 390, 400, 414, 424, 438, 443, 444, 445, 448, 462, 472, 486, 495, 510, 514, 515, 516, 517, 518, 534, 538, 558, 562}'

!! ERROR(S) in  14936042 / a7abb22e80ba29652cd4de506d28d256960b15c0a6011068b38848e22f18a626i0:
{"p":"orc-721","op":"mint","s":"orangepixels","g":[ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
141, 142, 143, 144, 145, 146, 147, 148, 149, 161,
162, 163, 164, 165, 166, 167, 168, 169, 170, 171,
172, 186, 187, 188, 189, 190, 191, 192, 193, 194,
195, 196, 210, 211, 212, 213, 214, 215, 216, 217,
225, 226, 227, 231, 232, 237, 238, 239, 240, 241,
244, 245, 246, 249, 250, 251, 252, 253, 254, 255,
256, 258, 259, 261, 262, 263, 264, 265, 268, 269,
270, 273, 274, 276, 277, 278, 280, 282, 283, 285,
286, 287, 288, 289, 292, 293, 294, 297, 298, 300,
301, 302, 304, 309, 310, 311, 312, 313, 316, 317,
318, 321, 322, 323, 324, 325, 326, 327, 328, 329,
331, 333, 334, 335, 336, 337, 345, 346, 347, 349,
350, 351, 352, 353, 357, 358, 359, 360, 361, 362,
363, 364, 369, 370, 371, 372, 379, 380, 381, 382,
383, 384, 385, 386, 387, 388, 394, 395, 396, 397,
398, 399, 400, 402, 403, 404, 405, 406, 407, 408,
409, 410, 411, 412, 413, 425, 426, 427, 428, 429,
430, 431, 432, 433, 434, 435, 436, 437, 438, 439,
440, 441, 442, 443, 444, 445, 446, 447, 448, 449,
450, 451, 452, 453, 454, 455, 456, 457, 458, 459,
460, 461, 462, 463, 464, 465, 466, 467, 468, 469,
470, 471, 472, 473, 474, 475, 476, 477, 478, 479,
480, 481, 482, 483, 484, 485, 486, 487, 488, 489,
490, 491, 492, 493, 494, 495, 496, 497, 498, 499,
500, 501, 502, 503, 504, 505, 506, 507, 508, 509,
510, 511, 512, 513, 514, 515, 516, 517, 518, 519,
520, 521, 522, 523, 524, 525, 526, 527, 528, 529,
530, 531, 532, 533, 534, 535, 536, 537, 538, 539]}

   - json parse -- unexpected token at '}'


text:
# Orange Pixels Quick Notes & Commentary

New to Orange Pixels? See [Orange Pixels](https://github.com/ZimmerAllDay/orangepixels) by ZimmerAllDay

## More Ready-Made Designs

### Words

![](i/gm.png)
in 4x
![](i/gm@4x.png)

Pixels

```
[44, 68, 92, 116, 140, 148, 149, 151, 153, 155,
156, 159, 160, 164, 171, 174, 175, 177, 178, 180,
182, 185, 188, 194, 199, 201, 205, 209, 212, 218,
223, 225, 233, 236, 243, 246, 247, 249, 257, 268,
269, 271, 273, 281, 284, 295, 319, 343, 367, 387,
390, 412, 413]
```

### Hearts

![](i/heart1.png)
in 4x
![](i/heart1@4x.png)

Pixels

```
[175, 176, 177, 182, 183, 184, 198, 199, 200, 201,
202, 205, 206, 207, 208, 209, 221, 222, 223, 225,
226, 227, 228, 229, 230, 231, 232, 233, 234, 245,
246, 248, 249, 250, 251, 252, 253, 254, 255, 256,
257, 258, 269, 270, 271, 272, 273, 274, 275, 276,
277, 278, 279, 280, 281, 282, 293, 294, 295, 296,
297, 298, 299, 300, 301, 302, 303, 304, 305, 306,
318, 319, 320, 321, 322, 323, 324, 325, 326, 327,
328, 329, 343, 344, 345, 346, 347, 348, 349, 350,
351, 352, 368, 369, 370, 371, 372, 373, 374, 375,
393, 394, 395, 396, 397, 398, 418, 419, 420, 421,
443, 444]
```

![](i/heart2.png)
in 4x
![](i/heart2@4x.png)

Pixels

```
[175, 176, 177, 182, 183, 184, 198, 199, 200, 201,
202, 205, 206, 207, 208, 209, 221, 222, 223, 225,
226, 227, 228, 230, 231, 232, 233, 234, 245, 246,
248, 249, 250, 251, 253, 254, 255, 256, 257, 258,
269, 270, 271, 272, 273, 274, 275, 276, 278, 279,
280, 281, 282, 293, 294, 295, 296, 297, 298, 299,
300, 302, 303, 304, 305, 306, 318, 319, 320, 321,
322, 323, 325, 326, 327, 328, 329, 343, 344, 345,
346, 347, 349, 350, 351, 352, 368, 369, 370, 371,
372, 374, 375, 393, 394, 395, 397, 398, 418, 419,
421, 443, 444]
```

![](i/heart3.png)
in 4x
![](i/heart3@4x.png)

Pixels

```
[175, 176, 177, 182, 183, 184, 198, 199, 200, 201,
202, 205, 209, 221, 222, 223, 225, 226, 227, 228,
234, 245, 246, 248, 249, 250, 251, 258, 269, 270,
271, 272, 273, 274, 275, 276, 282, 293, 294, 295,
296, 297, 298, 299, 300, 306, 318, 319, 320, 321,
322, 323, 329, 343, 344, 345, 346, 347, 352, 368,
369, 370, 371, 372, 375, 393, 394, 395, 398, 418,
419, 421, 443, 444]
```

![](i/heart4.png)
in 4x
![](i/heart4@4x.png)

Pixels

```
[175, 176, 177, 182, 183, 184, 198, 202, 205, 209,
221, 227, 228, 234, 245, 258, 269, 282, 293, 306,
318, 329, 343, 352, 368, 375, 393, 398, 418, 421,
443, 444]
```

### Smileys / Smilies

![](i/smiley1.png)
in 4x
![](i/smiley1@4x.png)

Pixels

```
[128, 129, 130, 131, 132, 133, 134, 135, 151, 152,
153, 154, 155, 156, 157, 158, 159, 160, 174, 175,
176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
207, 208, 209, 210, 221, 222, 223, 226, 227, 228,
229, 232, 233, 234, 245, 246, 248, 249, 251, 252,
254, 255, 257, 258, 269, 270, 271, 272, 273, 274,
275, 276, 277, 278, 279, 280, 281, 282, 293, 294,
305, 306, 317, 318, 320, 321, 322, 323, 324, 325,
326, 327, 329, 330, 341, 342, 343, 345, 346, 347,
348, 349, 350, 352, 353, 354, 365, 366, 367, 368,
375, 376, 377, 378, 390, 391, 392, 393, 394, 395,
396, 397, 398, 399, 400, 401, 415, 416, 417, 418,
419, 420, 421, 422, 423, 424, 440, 441, 442, 443,
444, 445, 446, 447]
```

![](i/smiley2.png)
in 4x
![](i/smiley2@4x.png)

Pixels

```
[128, 129, 130, 131, 132, 133, 134, 135, 151, 152,
153, 154, 155, 156, 157, 158, 159, 160, 174, 175,
178, 179, 180, 181, 184, 185, 197, 198, 199, 200,
201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
221, 222, 226, 227, 228, 229, 233, 234, 245, 247,
248, 251, 252, 254, 255, 258, 269, 271, 272, 275,
276, 278, 279, 282, 293, 297, 299, 300, 304, 306,
317, 318, 322, 323, 324, 325, 329, 330, 341, 342,
343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
353, 354, 365, 366, 367, 368, 369, 371, 372, 374,
375, 376, 377, 378, 390, 391, 392, 393, 394, 397,
398, 399, 400, 401, 415, 416, 417, 418, 419, 420,
421, 422, 423, 424, 440, 441, 442, 443, 444, 445,
446, 447]
```

![](i/smiley3.png)
in 4x
![](i/smiley3@4x.png)

Pixels

```
[101, 102, 104, 124, 125, 126, 127, 128, 130, 131,
132, 133, 134, 135, 148, 149, 151, 152, 154, 155,
156, 157, 158, 159, 160, 174, 175, 177, 178, 179,
180, 181, 184, 185, 196, 197, 198, 200, 201, 202,
203, 204, 205, 206, 207, 209, 210, 223, 226, 227,
228, 229, 232, 233, 234, 245, 246, 247, 250, 251,
252, 253, 256, 257, 258, 269, 270, 271, 274, 277,
280, 281, 282, 293, 294, 295, 296, 297, 299, 302,
303, 304, 305, 306, 317, 320, 321, 326, 327, 330,
341, 345, 346, 349, 350, 354, 365, 367, 368, 370,
371, 372, 373, 375, 376, 378, 390, 392, 393, 398,
399, 401, 415, 424, 440, 441, 442, 443, 444, 445,
446, 447]
```

![](i/smiley4.png)
in 4x
![](i/smiley4@4x.png)

Pixels

```
[128, 129, 130, 131, 132, 133, 134, 135, 151, 152,
153, 154, 155, 156, 157, 158, 159, 160, 174, 175,
176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
207, 208, 209, 210, 245, 251, 252, 258, 269, 275,
276, 282, 293, 294, 295, 296, 297, 298, 299, 300,
301, 302, 303, 304, 305, 306, 317, 318, 319, 320,
321, 322, 323, 324, 326, 327, 328, 329, 330, 341,
342, 343, 344, 345, 349, 350, 351, 352, 353, 354,
365, 366, 367, 368, 369, 370, 371, 372, 373, 374,
375, 376, 377, 378, 390, 391, 392, 393, 394, 395,
396, 397, 398, 399, 400, 401, 415, 416, 417, 418,
419, 420, 421, 422, 423, 424, 440, 441, 442, 443,
444, 445, 446, 447]
```

![](i/smiley5.png)
in 4x
![](i/smiley5@4x.png)

Pixels

```
[125, 128, 129, 130, 131, 132, 133, 134, 135, 138,
149, 150, 151, 153, 154, 155, 156, 157, 158, 160,
161, 162, 173, 174, 175, 177, 178, 179, 180, 181,
182, 184, 185, 186, 198, 200, 201, 202, 203, 204,
205, 206, 207, 209, 221, 223, 224, 225, 226, 227,
228, 229, 230, 231, 232, 234, 245, 246, 247, 248,
249, 250, 251, 252, 253, 254, 255, 256, 257, 258,
269, 270, 271, 274, 275, 276, 277, 280, 281, 282,
293, 294, 295, 296, 299, 300, 303, 304, 305, 306,
317, 318, 319, 320, 323, 324, 327, 328, 329, 330,
341, 342, 343, 344, 345, 346, 347, 348, 349, 350,
351, 352, 353, 354, 365, 366, 367, 368, 369, 371,
372, 374, 375, 376, 377, 378, 390, 391, 392, 393,
394, 397, 398, 399, 400, 401, 415, 416, 417, 418,
419, 420, 421, 422, 423, 424, 440, 441, 442, 443,
444, 445, 446, 447]
```

![](i/smiley6.png)
in 4x
![](i/smiley6@4x.png)

Pixels

```
[125, 128, 129, 130, 131, 132, 133, 134, 135, 138,
149, 150, 151, 153, 154, 155, 156, 157, 158, 160,
161, 162, 173, 174, 175, 177, 178, 179, 180, 181,
182, 184, 185, 186, 198, 200, 201, 202, 203, 204,
205, 206, 207, 209, 221, 223, 224, 225, 226, 227,
228, 229, 230, 231, 232, 234, 245, 246, 247, 248,
249, 250, 251, 252, 253, 254, 255, 256, 257, 258,
269, 270, 271, 274, 275, 276, 277, 280, 281, 282,
293, 294, 295, 296, 299, 300, 303, 304, 305, 306,
317, 318, 319, 320, 323, 324, 327, 328, 329, 330,
341, 342, 343, 344, 345, 346, 347, 348, 349, 350,
351, 352, 353, 354, 365, 366, 367, 368, 369, 370,
373, 374, 375, 376, 377, 378, 390, 391, 392, 393,
395, 396, 398, 399, 400, 401, 415, 416, 417, 418,
419, 420, 421, 422, 423, 424, 440, 441, 442, 443,
444, 445, 446, 447]
```

![](i/smiley7.png)
in 4x
![](i/smiley7@4x.png)

Pixels

```
[128, 129, 130, 131, 132, 133, 134, 135, 151, 152,
153, 154, 155, 156, 157, 158, 159, 160, 174, 175,
176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
197, 198, 199, 202, 203, 204, 205, 208, 209, 210,
221, 222, 224, 225, 226, 227, 228, 229, 230, 231,
233, 234, 245, 246, 247, 248, 249, 250, 251, 252,
253, 254, 255, 256, 257, 258, 269, 270, 271, 272,
273, 274, 275, 276, 277, 278, 279, 280, 281, 282,
293, 294, 295, 296, 303, 304, 305, 306, 317, 318,
319, 321, 325, 328, 329, 330, 341, 342, 343, 345,
348, 350, 352, 353, 354, 365, 366, 367, 369, 370,
371, 373, 376, 377, 378, 390, 391, 393, 394, 395,
396, 398, 400, 401, 415, 417, 418, 419, 420, 421,
423, 424, 440, 442, 443, 444, 446, 447]
```

### Apes, Monkeys, Gorillas

![](i/monkey1.png)
in 4x
![](i/monkey1@4x.png)

Pixels

```
[150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 160, 173, 174, 175, 176, 177, 178, 179, 180, 181,
 182, 183, 184, 185, 197, 198, 199, 200, 201, 202,
 203, 204, 205, 206, 207, 208, 209, 218, 219, 220,
 221, 222, 223, 224, 228, 229, 230, 233, 234, 235,
 236, 242, 243, 247, 248, 257, 260, 266, 267, 271,
 272, 275, 279, 281, 284, 290, 291, 295, 296, 299,
 303, 305, 306, 308, 314, 315, 319, 320, 330, 332,
 338, 339, 340, 341, 342, 343, 344, 348, 354, 355,
 356, 365, 366, 367, 368, 373, 374, 375, 376, 377,
 378, 389, 390, 391, 392, 393, 401, 414, 415, 416,
 417, 418, 419, 420, 421, 422, 423, 424]
```

Desing Tip:  Invert the colors (orange <=> transparent).

![](i/monkey1i.png)
in 4x
![](i/monkey1i@4x.png)

Pixels

```
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
141, 142, 143, 144, 145, 146, 147, 148, 149, 161,
162, 163, 164, 165, 166, 167, 168, 169, 170, 171,
172, 186, 187, 188, 189, 190, 191, 192, 193, 194,
195, 196, 210, 211, 212, 213, 214, 215, 216, 217,
225, 226, 227, 231, 232, 237, 238, 239, 240, 241,
244, 245, 246, 249, 250, 251, 252, 253, 254, 255,
256, 258, 259, 261, 262, 263, 264, 265, 268, 269,
270, 273, 274, 276, 277, 278, 280, 282, 283, 285,
286, 287, 288, 289, 292, 293, 294, 297, 298, 300,
301, 302, 304, 309, 310, 311, 312, 313, 316, 317,
318, 321, 322, 323, 324, 325, 326, 327, 328, 329,
331, 333, 334, 335, 336, 337, 345, 346, 347, 349,
350, 351, 352, 353, 357, 358, 359, 360, 361, 362,
363, 364, 369, 370, 371, 372, 379, 380, 381, 382,
383, 384, 385, 386, 387, 388, 394, 395, 396, 397,
398, 399, 400, 402, 403, 404, 405, 406, 407, 408,
409, 410, 411, 412, 413, 425, 426, 427, 428, 429,
430, 431, 432, 433, 434, 435, 436, 437, 438, 439,
440, 441, 442, 443, 444, 445, 446, 447, 448, 449,
450, 451, 452, 453, 454, 455, 456, 457, 458, 459,
460, 461, 462, 463, 464, 465, 466, 467, 468, 469,
470, 471, 472, 473, 474, 475, 476, 477, 478, 479,
480, 481, 482, 483, 484, 485, 486, 487, 488, 489,
490, 491, 492, 493, 494, 495, 496, 497, 498, 499,
500, 501, 502, 503, 504, 505, 506, 507, 508, 509,
510, 511, 512, 513, 514, 515, 516, 517, 518, 519,
520, 521, 522, 523, 524, 525, 526, 527, 528, 529,
530, 531, 532, 533, 534, 535, 536, 537, 538, 539,
540, 541, 542, 543, 544, 545, 546, 547, 548, 549,
550, 551, 552, 553, 554, 555, 556, 557, 558, 559,
560, 561, 562, 563, 564, 565, 566, 567, 568, 569,
570, 571, 572, 573, 574, 575]
```

![](i/monkey2.png)
in 4x
![](i/monkey2@4x.png)

Pixels

```
175, 176, 177, 178, 179, 180, 181, 182, 183, 195,
196, 198, 199, 200, 201, 202, 203, 204, 205, 206,
207, 208, 210, 211, 218, 219, 220, 221, 222, 223,
224, 226, 227, 228, 230, 231, 232, 233, 234, 235,
236, 242, 245, 246, 247, 250, 251, 252, 255, 256,
257, 260, 266, 267, 268, 270, 271, 272, 273, 274,
275, 276, 277, 278, 279, 280, 282, 283, 284, 290,
291, 292, 293, 294, 295, 296, 297, 299, 301, 302,
303, 304, 305, 306, 307, 308, 315, 316, 317, 318,
319, 321, 322, 323, 324, 325, 327, 328, 329, 330,
331, 342, 343, 345, 346, 347, 348, 349, 351, 352,
366, 367, 375, 376, 390, 391, 394, 395, 396, 399,
400, 415, 416, 422, 423, 440, 441, 442, 443, 444,
445, 446
```

![](i/monkey2i.png)
in 4x
![](i/monkey2i@4x.png)

Pixels

```
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
171, 172, 173, 174, 184, 185, 186, 187, 188, 189,
190, 191, 192, 193, 194, 197, 209, 212, 213, 214,
215, 216, 217, 225, 229, 237, 238, 239, 240, 241,
243, 244, 248, 249, 253, 254, 258, 259, 261, 262,
263, 264, 265, 269, 281, 285, 286, 287, 288, 289,
298, 300, 309, 310, 311, 312, 313, 314, 320, 326,
332, 333, 334, 335, 336, 337, 338, 339, 340, 341,
344, 350, 353, 354, 355, 356, 357, 358, 359, 360,
361, 362, 363, 364, 365, 368, 369, 370, 371, 372,
373, 374, 377, 378, 379, 380, 381, 382, 383, 384,
385, 386, 387, 388, 389, 392, 393, 397, 398, 401,
402, 403, 404, 405, 406, 407, 408, 409, 410, 411,
412, 413, 414, 417, 418, 419, 420, 421, 424, 425,
426, 427, 428, 429, 430, 431, 432, 433, 434, 435,
436, 437, 438, 439, 447, 448, 449, 450, 451, 452,
453, 454, 455, 456, 457, 458, 459, 460, 461, 462,
463, 464, 465, 466, 467, 468, 469, 470, 471, 472,
473, 474, 475, 476, 477, 478, 479, 480, 481, 482,
483, 484, 485, 486, 487, 488, 489, 490, 491, 492,
493, 494, 495, 496, 497, 498, 499, 500, 501, 502,
503, 504, 505, 506, 507, 508, 509, 510, 511, 512,
513, 514, 515, 516, 517, 518, 519, 520, 521, 522,
523, 524, 525, 526, 527, 528, 529, 530, 531, 532,
533, 534, 535, 536, 537, 538, 539, 540, 541, 542,
543, 544, 545, 546, 547, 548, 549, 550, 551, 552,
553, 554, 555, 556, 557, 558, 559, 560, 561, 562,
563, 564, 565, 566, 567, 568, 569, 570, 571, 572,
573, 574, 575]
```

![](i/monkey3.png)
in 4x
![](i/monkey3@4x.png)

Pixels

```
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
101, 102, 103, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 129, 130, 131, 132, 133, 134,
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197,
200, 201, 203, 205, 207, 208, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 222, 227, 229, 234, 235,
236, 237, 238, 239, 240, 241, 242, 243, 245, 246, 250,
254, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
270, 271, 281, 282, 283, 284, 285, 286, 287, 288, 289,
290, 291, 292, 293, 294, 295, 297, 298, 299, 301, 302,
303, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
315, 316, 317, 318, 321, 322, 326, 327, 330, 331, 332,
333, 334, 335, 336, 337, 338, 339, 340, 341, 348, 355,
356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 372,
379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389,
391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401,
403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413,
415, 425, 427, 428, 429, 430, 431, 432, 433, 434, 435,
436, 437, 443, 444, 445, 451, 452, 453, 454, 455, 456,
457, 458, 459, 460, 461, 462, 474, 475, 476, 477, 478,
479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489,
490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500,
501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511,
512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522,
523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533,
534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544,
545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555,
556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566,
567, 568, 569, 570, 571, 572, 573, 574, 575]
```

## Questions? Comments?

Please post in the #generative-orc-721 channel
in the ordinal punks discord.
For an invite
see <https://twitter.com/OrdinalPunks/status/1620230583711576068>.